From 25d4a2196094b5342088e914e9b1a9a79a12110d Mon Sep 17 00:00:00 2001 From: xiongraorao Date: Tue, 28 Aug 2018 21:10:16 +0800 Subject: [PATCH] 8.28 --- .../raorao/interview/haoweilai/t1/Main.java | 38 +++++++ .../raorao/interview/haoweilai/t1/Main2.java | 47 +++++++++ .../raorao/interview/haoweilai/t2/Main.java | 47 +++++++++ .../raorao/interview/haoweilai/t3/Main.java | 56 +++++++++++ .../raorao/interview/haoweilai/t4/Main.java | 32 ++++++ code/src/main/java/com/raorao/java/A.java | 25 +++++ interview/answer.md | 95 ++++++++++++++++++ interview/java/img/工厂方法.png | Bin 0 -> 28859 bytes interview/java/img/简单工厂模式.png | Bin 0 -> 14524 bytes interview/java/设计模式.md | 92 +++++++++++++++++ interview/note.md | 4 +- 11 files changed, 435 insertions(+), 1 deletion(-) create mode 100644 code/src/main/java/com/raorao/interview/haoweilai/t1/Main.java create mode 100644 code/src/main/java/com/raorao/interview/haoweilai/t1/Main2.java create mode 100644 code/src/main/java/com/raorao/interview/haoweilai/t2/Main.java create mode 100644 code/src/main/java/com/raorao/interview/haoweilai/t3/Main.java create mode 100644 code/src/main/java/com/raorao/interview/haoweilai/t4/Main.java create mode 100644 interview/java/img/工厂方法.png create mode 100644 interview/java/img/简单工厂模式.png create mode 100644 interview/java/设计模式.md diff --git a/code/src/main/java/com/raorao/interview/haoweilai/t1/Main.java b/code/src/main/java/com/raorao/interview/haoweilai/t1/Main.java new file mode 100644 index 00000000..3b857ebc --- /dev/null +++ b/code/src/main/java/com/raorao/interview/haoweilai/t1/Main.java @@ -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; + } +} diff --git a/code/src/main/java/com/raorao/interview/haoweilai/t1/Main2.java b/code/src/main/java/com/raorao/interview/haoweilai/t1/Main2.java new file mode 100644 index 00000000..d7f39dba --- /dev/null +++ b/code/src/main/java/com/raorao/interview/haoweilai/t1/Main2.java @@ -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]; + } +} diff --git a/code/src/main/java/com/raorao/interview/haoweilai/t2/Main.java b/code/src/main/java/com/raorao/interview/haoweilai/t2/Main.java new file mode 100644 index 00000000..63079e1d --- /dev/null +++ b/code/src/main/java/com/raorao/interview/haoweilai/t2/Main.java @@ -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; + } + +} diff --git a/code/src/main/java/com/raorao/interview/haoweilai/t3/Main.java b/code/src/main/java/com/raorao/interview/haoweilai/t3/Main.java new file mode 100644 index 00000000..d52ad087 --- /dev/null +++ b/code/src/main/java/com/raorao/interview/haoweilai/t3/Main.java @@ -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 res = new ArrayList<>(); + List boolList = new ArrayList<>(); + + List 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 zeros, int[] bool, List 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; + } + +} diff --git a/code/src/main/java/com/raorao/interview/haoweilai/t4/Main.java b/code/src/main/java/com/raorao/interview/haoweilai/t4/Main.java new file mode 100644 index 00000000..32754d66 --- /dev/null +++ b/code/src/main/java/com/raorao/interview/haoweilai/t4/Main.java @@ -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); + } + +} diff --git a/code/src/main/java/com/raorao/java/A.java b/code/src/main/java/com/raorao/java/A.java index 91dd2598..1c0f279d 100644 --- a/code/src/main/java/com/raorao/java/A.java +++ b/code/src/main/java/com/raorao/java/A.java @@ -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())); + } } diff --git a/interview/answer.md b/interview/answer.md index da5e5feb..3be52061 100644 --- a/interview/answer.md +++ b/interview/answer.md @@ -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为什么不可靠 diff --git a/interview/java/img/工厂方法.png b/interview/java/img/工厂方法.png new file mode 100644 index 0000000000000000000000000000000000000000..c5bb3ad4c626a8ccd15eadba13713cef2dc7dd67 GIT binary patch literal 28859 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 literal 0 HcmV?d00001 diff --git a/interview/java/设计模式.md b/interview/java/设计模式.md new file mode 100644 index 00000000..502f595f --- /dev/null +++ b/interview/java/设计模式.md @@ -0,0 +1,92 @@ + + +- [快速理解设计模式](#快速理解设计模式) +- [创建型模式](#创建型模式) + - [单例模式](#单例模式) + - [简单工厂模式](#简单工厂模式) + - [工厂方法](#工厂方法) + - [抽象工厂模式](#抽象工厂模式) + - [建造者(生成器)模式](#建造者生成器模式) + + + +# 快速理解设计模式 + +设计模式主要分为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) + +## 建造者(生成器)模式 + diff --git a/interview/note.md b/interview/note.md index e9a29c06..74c17fa0 100644 --- a/interview/note.md +++ b/interview/note.md @@ -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(新投递) | 电面 | 一面已经挂了

  • 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)