This commit is contained in:
xiongraorao 2018-08-28 21:10:16 +08:00
parent b59469dfee
commit 25d4a21960
11 changed files with 435 additions and 1 deletions

View File

@ -0,0 +1,38 @@
package com.raorao.interview.haoweilai.t1;
import java.util.Scanner;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-28-19:01
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
System.out.println(process(input));
}
private static int process(String str) {
if (str == null || str.length() == 0) {
return 0;
}
if(str.length() == 1 && Integer.parseInt(str) == 0){
return 1;
}
int len = str.length();
int count = 0;
int sum = 0;
for (int i = 0; i < len; i++) {
sum += str.charAt(i) - '0';
if (sum % 3 == 0) {
count++;
sum = 0;
}
}
return count;
}
}

View File

@ -0,0 +1,47 @@
package com.raorao.interview.haoweilai.t1;
import java.util.Scanner;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-28-19:01
*/
public class Main2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
System.out.println(process(input));
}
private static boolean isOk(String input, int start, int end) {
int k = 0;
for (int i = start; i < end; i++) {
k = 10 * k + input.charAt(i) - '0';
}
return (k % 3 == 0);
}
private static int process(String str) {
if (str == null || str.length() == 0) {
return 0;
}
int len = str.length();
int[] v = new int[len + 1];
for (int i = 1; i <= len; i++) {
int j = i - 1;
while (!isOk(str, j, i) && j > 0) {
j--;
}
if (isOk(str, j, i)) {
v[i] = Math.max(v[i - 1], v[j] + 1);
} else {
v[i] = v[i - 1];
}
}
return v[len];
}
}

View File

@ -0,0 +1,47 @@
package com.raorao.interview.haoweilai.t2;
import java.util.Scanner;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-28-19:12
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = Integer.parseInt(scanner.nextLine());
int[] res = new int[t];
int[][] input = new int[t][2];
for (int i = 0; i < t; i++) {
String[] tmp = scanner.nextLine().split(" ");
input[i][0] = Integer.parseInt(tmp[0]);
input[i][1] = Integer.parseInt(tmp[1]);
}
for (int i = 0; i < t; i++) {
res[i] = process(input[i][0], input[i][1]);
}
for (int i = 0; i < res.length; i++) {
System.out.println(res[i]);
}
}
private static int process(int x, int k) {
int y = 1;
while (k > 0) {
boolean bool = x + y == (x | y);
if (bool) {
y++;
k--;
} else {
y++;
}
}
return y-1;
}
}

View File

@ -0,0 +1,56 @@
package com.raorao.interview.haoweilai.t3;
import java.util.ArrayList;
import java.util.List;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-28-19:57
*/
public class Main {
public static void main(String[] args) {
int[] arr = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] bool = new int[] {0, 1, 1, 1, 1, 1, 1, 1, 1, 0};
process(arr, bool);
}
private static void process(int[] arr, int[] bool) {
List<String> res = new ArrayList<>();
List<int[]> boolList = new ArrayList<>();
List<Integer> zeros = new ArrayList<>();
for (int i = 0; i < bool.length; i++) {
if (bool[i] == 0) {
zeros.add(i);
}
}
back(zeros,bool, boolList, 0);
for (int i = 0; i < boolList.size(); i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < boolList.get(i).length; j++) {
if (bool[j] == 1) {
sb.append(arr[j]);
}
}
res.add(sb.toString());
}
res.forEach(e -> System.out.println(e));
}
private static void back(List<Integer> zeros, int[] bool, List<int[]> res, int k) {
}
private static int[] arrCopy(int[] arr) {
int n = arr.length;
int[] res = new int[n];
System.arraycopy(arr, 0, res, 0, n);
return res;
}
}

View File

@ -0,0 +1,32 @@
package com.raorao.interview.haoweilai.t4;
import java.util.Scanner;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-28-20:47
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] line1 = scanner.nextLine().split(" ");
int n = Integer.parseInt(line1[0]);
int m = Integer.parseInt(line1[1]);
String[] line2 = scanner.nextLine().split(" ");
int[] score = new int[n];
for (int i = 0; i < n; i++) {
score[i] = Integer.parseInt(line2[i]);
}
float sum = 0, k;
for (int i = 0; i < n; i++) {
sum += score[i];
}
sum /= n - m;
System.out.printf("%.2f", sum);
}
}

View File

@ -1,5 +1,10 @@
package com.raorao.java;
import io.netty.buffer.ByteBuf;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
/**
* .
*
@ -8,4 +13,24 @@ package com.raorao.java;
*/
public class A {
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.wrap(new byte[12]);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays.toString(bb.array()));
// 反转缓冲区
bb.rewind();
// 设置字节存储次序
bb.order(ByteOrder.BIG_ENDIAN);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays.toString(bb.array()));
// 反转缓冲区
bb.rewind();
// 设置字节存储次序
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays.toString(bb.array()));
}
}

View File

@ -7,6 +7,7 @@
- [foreach与正常for循环效率对比](#foreach与正常for循环效率对比)
- [java反射的作用于原理](#java反射的作用于原理)
- [java 动态代理](#java-动态代理)
- [foreach与正常for循环效率对比](#foreach与正常for循环效率对比-1)
- [数据库](#数据库)
- [truncate与 delete区别](#truncate与-delete区别)
- [B+树索引和哈希索引的区别](#b树索引和哈希索引的区别)
@ -19,6 +20,7 @@
- [Linux](#linux-1)
- [Buffer和Cache的区别](#buffer和cache的区别)
- [个人理解](#个人理解)
- [什么是大小端模式](#什么是大小端模式)
- [计算机网络](#计算机网络)
- [UDP为什么不可靠](#udp为什么不可靠)
@ -77,7 +79,94 @@ Java 反射是可以让我们在运行时通过一个类的Class对象来获
### java 动态代理
实现InvocationHandler接口重写invoke方法来调用被代理的类的方法。
client端通过Proxy.newProxyInstance来获取代理后的对象这里使用了代理模式
``` java
public class RealSubject implements Subject
{
@Override
public void rent()
{
System.out.println("I want to rent my house");
}
@Override
public void hello(String str)
{
System.out.println("hello: " + str);
}
}
```
``` java
public class DynamicProxy implements InvocationHandler
{
// 这个就是我们要代理的真实对象
private Object subject;
// 构造方法,给我们要代理的真实对象赋初值
public DynamicProxy(Object subject)
{
this.subject = subject;
}
@Override
public Object invoke(Object object, Method method, Object[] args)
throws Throwable
{
//  在代理真实对象前我们可以添加一些自己的操作
System.out.println("before rent house");
System.out.println("Method:" + method);
// 当代理对象调用真实对象的方法时其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
method.invoke(subject, args);
//  在代理真实对象后我们也可以添加一些自己的操作
System.out.println("after rent house");
return null;
}
}
```
``` java
public class Client
{
public static void main(String[] args)
{
// 我们要代理的真实对象
Subject realSubject = new RealSubject();
// 我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
InvocationHandler handler = new DynamicProxy(realSubject);
/*
* 通过Proxy的newProxyInstance方法来创建我们的代理对象我们来看看其三个参数
* 第一个参数 handler.getClass().getClassLoader() 我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象
* 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
* 第三个参数handler 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
*/
Subject subject = (Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject
.getClass().getInterfaces(), handler);
System.out.println(subject.getClass().getName());
subject.rent();
subject.hello("world");
}
}
```
### foreach与正常for循环效率对比
在java中进行测试发现
需要循环数组结构的数据时建议使用普通for循环因为for循环采用下标访问对于数组结构的数据来说采用下标访问比较好。
需要循环链表结构的数据时一定不要使用普通for循环这种做法很糟糕数据量大的时候有可能会导致系统崩溃。
# 数据库
@ -233,6 +322,12 @@ Cache就是加快读取的速度分为磁盘缓存和CPU缓存。
动态RAM 计算机内存。
静态RAM CPU高速缓存。
## 什么是大小端模式
大端模式(高尾),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
小端模式(低尾),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
# 计算机网络
## UDP为什么不可靠

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,92 @@
<!-- TOC -->
- [快速理解设计模式](#快速理解设计模式)
- [创建型模式](#创建型模式)
- [单例模式](#单例模式)
- [简单工厂模式](#简单工厂模式)
- [工厂方法](#工厂方法)
- [抽象工厂模式](#抽象工厂模式)
- [建造者(生成器)模式](#建造者生成器模式)
<!-- /TOC -->
# 快速理解设计模式
设计模式主要分为3大类分别是创建型模式、行为型模式和结构型模式。
# 创建型模式
创建型模式主要是和创建对象相关的一些设计模式
## 单例模式
目的确保某个类在jvm中只有一个实例提供该实例的全局访问点。
类图:使用一个私有构造函数、私有静态变量,和一个共有的静态函数来实现
懒汉式(线程不安全)、饿汉式、懒汉式(线程安全)
双重校验锁注意volatile):
``` java
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
```
为什么要使用volatile
uniqueInstance = new Singleton(); 这段代码其实是分三步执行:
1. 分配内存空间
2. 初始化对象
3. 将 uniqueInstance 指向分配的内存地址
JVM的指令重排序可能导致执行顺序编程1-3-2, 在多线程情况下,可能获取一个没有初始化的实例,导致程序出错。
使用volatile 可以禁止JVM的指令重排序保证多线程的环境下程序的正常运行。
静态内部类:
实现延迟加载,也能实现一次加载,线程安全、相当于同步的懒汉式
枚举类型:单例模式的最佳实践,实现简单,并且能在面对复杂的序列化或者反射攻击的时候,能够防止实例化多次。
## 简单工厂模式
目的:创建对象的时候隐藏内部细节,提供一个创建对象的通用接口。
类图在简单工厂模式中根据传入type类型来决定到底生产哪种具体的产品类
![](img/简单工厂模式.png)
## 工厂方法
目的:工厂方法把类的实例化操作放到子类来执行,本身抽象化。
类图:在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
![](img/工厂方法.png)
## 抽象工厂模式
目的: 抽象工厂模式使用抽象工厂类来产生多个具体的工厂由具体的工厂来生产各自的产品最终关联到抽象产品类中client通过抽象工厂来生产具体的产品。
![](/pics/8668a3e1-c9c7-4fcb-98b2-a96a5d841579.png)
## 建造者(生成器)模式

View File

@ -41,7 +41,7 @@ Java后端开发大数据、分布式应用等
华为 |8.1 | 8.21
百度 | 8.22 | 8.22(新投递) |
网易 | 8.22 | 8.22(新投递) |
腾讯 | 8.22 | 8.22(新投递) | 电面 | 一面已经挂了
腾讯 | 8.22 | 8.22(新投递) | 电面 | 一面已经挂了<li> 8.28 第二次一面也挂了
Intel | 8.23 | 8.23(新投递) | 电面 | 8.24一面
美团点评 | 8.6 | 8.27 |
@ -60,6 +60,8 @@ Intel | 8.23 | 8.23(新投递) | 电面 | 8.24一面
> [Java并发和多线程](java/thread.md)
> [快速理解设计模式](java/设计模式.md)
## 数据结构和算法
> [排序](http://xraorao.top/2018/07/11/%E5%B8%B8%E8%A7%81%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/#more)