From f4160043bd9584bc35641cf94f6f0f385e13124d Mon Sep 17 00:00:00 2001 From: xiongraorao Date: Mon, 20 Aug 2018 21:42:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BB=A3=E7=A0=81=E5=92=8C?= =?UTF-8?q?=E7=AE=80=E5=8E=86=E6=8A=95=E9=80=92=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/raorao/leetcode/q001/TwoSum.java | 44 +++++++++++ .../raorao/leetcode/q002/AddTwoNumbers.java | 79 +++++++++++++++++++ .../raorao/leetcode/q003/MaxSubString.java | 43 ++++++++++ .../com/raorao/leetcode/q088/MergeArray.java | 36 +++++++++ .../com/raorao/leetcode/q141/IsLinkCycle.java | 60 ++++++++++++++ .../java/com/raorao/leetcode/q215/Kth.java | 78 ++++++++++++++++++ .../raorao/leetcode/q345/ReverseVowels.java | 40 ++++++++++ .../raorao/leetcode/q633/JudgeSquareSum.java | 33 ++++++++ .../raorao/leetcode/q680/ValidPalindrome.java | 36 +++++++++ interview/README.md | 34 -------- interview/note.md | 4 +- 11 files changed, 452 insertions(+), 35 deletions(-) create mode 100644 code/src/main/java/com/raorao/leetcode/q001/TwoSum.java create mode 100644 code/src/main/java/com/raorao/leetcode/q002/AddTwoNumbers.java create mode 100644 code/src/main/java/com/raorao/leetcode/q003/MaxSubString.java create mode 100644 code/src/main/java/com/raorao/leetcode/q088/MergeArray.java create mode 100644 code/src/main/java/com/raorao/leetcode/q141/IsLinkCycle.java create mode 100644 code/src/main/java/com/raorao/leetcode/q215/Kth.java create mode 100644 code/src/main/java/com/raorao/leetcode/q345/ReverseVowels.java create mode 100644 code/src/main/java/com/raorao/leetcode/q633/JudgeSquareSum.java create mode 100644 code/src/main/java/com/raorao/leetcode/q680/ValidPalindrome.java diff --git a/code/src/main/java/com/raorao/leetcode/q001/TwoSum.java b/code/src/main/java/com/raorao/leetcode/q001/TwoSum.java new file mode 100644 index 00000000..b88d2d7a --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q001/TwoSum.java @@ -0,0 +1,44 @@ +package com.raorao.leetcode.q001; + +import java.util.HashMap; +import java.util.Map; + +/** + * 题目描述:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 + * + * @author Xiong Raorao + * @since 2018-08-20-16:54 + */ +public class TwoSum { + + public static void main(String[] args) { + int[] input = new int[] {12, 7, 11, 15}; + int target = 18; + int[] ret = new TwoSum().twoSum(input, target); + System.out.println("ret= " + ret[0] + ", " + ret[1]); + } + + public int[] twoSum(int[] nums, int target) { + Map map = new HashMap<>(); + int[] ret = new int[2]; + for (int i = 0; i < nums.length; i++) { + int element = target - nums[i]; + if (map.containsKey(element) && map.get(element) != i) { + if (i < map.get(element)) { + ret[0] = i; + ret[1] = map.get(element); + } else { + ret[0] = map.get(element); + ret[1] = i; + } + return ret; + } + map.put(nums[i], i); + } + return new int[0]; + } + +} + + + diff --git a/code/src/main/java/com/raorao/leetcode/q002/AddTwoNumbers.java b/code/src/main/java/com/raorao/leetcode/q002/AddTwoNumbers.java new file mode 100644 index 00000000..a6db7c8d --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q002/AddTwoNumbers.java @@ -0,0 +1,79 @@ +package com.raorao.leetcode.q002; + +import java.util.List; + +/** + * 两数相加. + * + * 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 + * + * @author Xiong Raorao + * @since 2018-08-20-17:27 + */ +public class AddTwoNumbers { + + public static void main(String[] args) { +// ListNode l1 = new ListNode(2); +// l1.next = new ListNode(4); +// l1.next.next = new ListNode(3); +// ListNode l2 = new ListNode(5); +// l2.next = new ListNode(6); +// l2.next.next = new ListNode(4); + ListNode l1 = new ListNode(5); + ListNode l2 = new ListNode(5); + ListNode ret = new AddTwoNumbers().addTwoNumbers(l1, l2); + while (ret != null) { + System.out.print(ret.val + " "); + ret = ret.next; + } + } + + public ListNode addTwoNumbers(ListNode l1, ListNode l2) { + int bit = 0; // 进位标识 + ListNode ret = new ListNode(0); + ListNode root = ret; + ListNode node1 = l1; + ListNode node2 = l2; + while (node1 != null || node2 != null || bit > 0) { + int sum = 0; + if (node1 != null && node2 != null) { + sum = node1.val + node2.val + bit; + } else if (node2 != null) { + sum = node2.val + bit; + } else if (node1 != null) { + sum = node1.val + bit; + } else { + sum = bit; + } + + if (sum > 9) { + bit = sum / 10; + // 链表尾插法 + ret.next = new ListNode(sum % 10); + ret = ret.next; + } else { + ret.next = new ListNode(sum); + ret = ret.next; + bit = 0; + } + if (node1 != null) { + node1 = node1.next; + } + if (node2 != null) { + node2 = node2.next; + } + } + + return root.next; + } + + static class ListNode { + + int val; + ListNode next; + + ListNode(int x) { + val = x; + } + } +} diff --git a/code/src/main/java/com/raorao/leetcode/q003/MaxSubString.java b/code/src/main/java/com/raorao/leetcode/q003/MaxSubString.java new file mode 100644 index 00000000..4a32ecb1 --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q003/MaxSubString.java @@ -0,0 +1,43 @@ +package com.raorao.leetcode.q003; + +import java.util.HashMap; +import java.util.Map; + +/** + * 无重复的最长子串. + * + * @author Xiong Raorao + * @since 2018-08-20-19:31 + */ +public class MaxSubString { + + public static void main(String[] args) { + String input = "abcabcbb"; + int result = new MaxSubString().lengthOfLongestSubstring(input); + System.out.println(result); + } + + public int lengthOfLongestSubstring(String s) { + if (s == null || s.length() == 0) { + return 0; + } + Map map = new HashMap<>(); + int result = 1; + int count = 0; + for (int i = 0; i < s.length(); i++) { + if (!map.containsKey(s.charAt(i))) { + map.put(s.charAt(i), i); + count++; + } else { + count = 0; + i = map.get(s.charAt(i)); + map.clear(); + } + if (result < count) { + result = count; + } + } + return result; + } + +} diff --git a/code/src/main/java/com/raorao/leetcode/q088/MergeArray.java b/code/src/main/java/com/raorao/leetcode/q088/MergeArray.java new file mode 100644 index 00000000..8dc50628 --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q088/MergeArray.java @@ -0,0 +1,36 @@ +package com.raorao.leetcode.q088; + +/** + * 归并两个有序数组. + * + * @author Xiong Raorao + * @since 2018-08-20-15:37 + */ +public class MergeArray { + + public static void main(String[] args) { + int[] nums1 = new int[] {1, 2, 3, 0, 0, 0}; + int[] nums2 = new int[] {2, 5, 6}; + new MergeArray().merge(nums1, 3, nums2, 3); + System.out.println(" "); + } + + public void merge(int[] nums1, int m, int[] nums2, int n) { + int[] temp = new int[m + n]; + int i = 0; + int j = 0; + int t = 0; + while (i < m && j < n) { + temp[t++] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++]; + } + while (i < m) { + temp[t++] = nums1[i++]; + } + while (j < n) { + temp[t++] = nums2[j++]; + } + + // temp copy to nums1 + System.arraycopy(temp, 0, nums1, 0, m + n); + } +} diff --git a/code/src/main/java/com/raorao/leetcode/q141/IsLinkCycle.java b/code/src/main/java/com/raorao/leetcode/q141/IsLinkCycle.java new file mode 100644 index 00000000..654367ef --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q141/IsLinkCycle.java @@ -0,0 +1,60 @@ +package com.raorao.leetcode.q141; + +import java.util.ArrayList; +import java.util.List; + +/** + * 判断链表是否存在环. + * + * 两种方法:一种采用外存来存储节点 另外一种,采用快慢指针的方法 + * + * @author Xiong Raorao + * @since 2018-08-20-15:49 + */ +public class IsLinkCycle { + + + public boolean hasCycle(ListNode head) { + if (head == null) { + return false; + } + List nodes = new ArrayList<>(); + ListNode node = head; + while (node != null) { + if (!nodes.contains(node)) { + nodes.add(node); + node = node.next; + } else { + return true; + } + } + return false; + } + + public boolean hasCycle2(ListNode head) { + if (head == null || head.next == null) { + return false; + } + ListNode slow = head; + ListNode fast = head.next; + while (fast != null && fast.next != null) { + if (slow == fast) { + return true; + } + slow = slow.next; + fast = fast.next.next; + } + return false; + } + + static class ListNode { + + int val; + ListNode next; + + ListNode(int x) { + val = x; + next = null; + } + } +} diff --git a/code/src/main/java/com/raorao/leetcode/q215/Kth.java b/code/src/main/java/com/raorao/leetcode/q215/Kth.java new file mode 100644 index 00000000..2ca38aa7 --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q215/Kth.java @@ -0,0 +1,78 @@ +package com.raorao.leetcode.q215; + +import java.util.PriorityQueue; + +/** + * 求未排序数组的第K大元素. + * + * @author Xiong Raorao + * @since 2018-08-20-16:34 + */ +public class Kth { + + public static void main(String[] args) { + int[] input = new int[] {3, 2, 1, 5, 6, 4}; + int k = 2; + int result = new Kth().findKthLargest2(input, k); + System.out.println(result); + //Arrays.stream(input).forEach(e -> System.out.print(e + " ")); + } + + /** + * 解法一:构建大顶堆 + */ + public int findKthLargest(int[] nums, int k) { + PriorityQueue queue = new PriorityQueue<>(); + for (int num : nums) { + queue.add(num); + if (queue.size() > k) { + queue.poll(); + } + } + return queue.peek(); + } + + /** + * 解法二:快速选择,时间复杂度O(N),空间复杂度O(1) + */ + public int findKthLargest2(int[] nums, int k) { + k = nums.length - k; + int l = 0, h = nums.length - 1; + while (l < h) { + int j = partition(nums, l, h); + if (j == k) { + break; + } else if (j < k) { + l = j + 1; + } else { + h = j - 1; + } + } + return nums[k]; + } + + private int partition(int[] a, int l, int h) { + int i = l, j = h + 1; + while (true) { + while (a[++i] < a[l] && i < h) { + + } + while (a[--j] > a[l] && j > l) { + + } + if (i >= j) { + break; + } + swap(a, i, j); + } + swap(a, l, j); + return j; + } + + private void swap(int[] a, int i, int j) { + int t = a[i]; + a[i] = a[j]; + a[j] = t; + } + +} diff --git a/code/src/main/java/com/raorao/leetcode/q345/ReverseVowels.java b/code/src/main/java/com/raorao/leetcode/q345/ReverseVowels.java new file mode 100644 index 00000000..d0362c58 --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q345/ReverseVowels.java @@ -0,0 +1,40 @@ +package com.raorao.leetcode.q345; + +import java.util.Arrays; +import java.util.List; + +/** + * 反转元音字母. + * + * @author Xiong Raorao + * @since 2018-08-20-11:32 + */ +public class ReverseVowels { + + private List vowels = Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'); + + public static void main(String[] args) { + String input = "hello"; + String out = new ReverseVowels().reverseVowels(input); + System.out.println(out); + } + + public String reverseVowels(String s) { + int i = 0; + int j = s.length() - 1; + char[] result = new char[s.length()]; + while (i <= j) { + char ci = s.charAt(i); + char cj = s.charAt(j); + if (!vowels.contains(ci)) { + result[i++] = ci; + } else if (!vowels.contains(cj)) { + result[j--] = cj; + } else { + result[i++] = cj; + result[j--] = ci; + } + } + return new String(result); + } +} diff --git a/code/src/main/java/com/raorao/leetcode/q633/JudgeSquareSum.java b/code/src/main/java/com/raorao/leetcode/q633/JudgeSquareSum.java new file mode 100644 index 00000000..47c18fff --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q633/JudgeSquareSum.java @@ -0,0 +1,33 @@ +package com.raorao.leetcode.q633; + +/** + * 判断一个数是否为两个数的平方和. + * + * 双指针问题 + * + * @author Xiong Raorao + * @since 2018-08-20-11:25 + */ +public class JudgeSquareSum { + + public static void main(String[] args) { + System.out.println(judgeSquareSum(1000)); + } + + public static boolean judgeSquareSum(int c) { + int i = 0; + int j = (int) Math.sqrt(c); + while (i <= j) { + int sum = i * i + j * j; + if (sum == c) { + //System.out.println("i = " + i + ", j = " + j); + return true; + } else if (sum < c) { + i++; + } else { + j--; + } + } + return false; + } +} diff --git a/code/src/main/java/com/raorao/leetcode/q680/ValidPalindrome.java b/code/src/main/java/com/raorao/leetcode/q680/ValidPalindrome.java new file mode 100644 index 00000000..464d96d6 --- /dev/null +++ b/code/src/main/java/com/raorao/leetcode/q680/ValidPalindrome.java @@ -0,0 +1,36 @@ +package com.raorao.leetcode.q680; + +/** + * 验证回文字符串. + * + * @author Xiong Raorao + * @since 2018-08-20-15:07 + */ +public class ValidPalindrome { + + public static void main(String[] args) { + String input = "abcba"; + boolean res = new ValidPalindrome().validPalindrome(input); + System.out.println(res); + } + + public boolean validPalindrome(String s) { + int i = -1; + int j = s.length(); + while (++i < --j) { + if (s.charAt(i) != s.charAt(j)) { + return isPalindrome(s, i, j - 1) || isPalindrome(s, i + 1, j); + } + } + return true; + } + + private boolean isPalindrome(String s, int i, int j) { + while (i < j) { + if (s.charAt(i++) != s.charAt(j--)) { + return false; + } + } + return true; + } +} diff --git a/interview/README.md b/interview/README.md index f1d3aa47..3ef1f57c 100644 --- a/interview/README.md +++ b/interview/README.md @@ -142,37 +142,3 @@ linux指令 P/V 操作 磁盘调度,虚拟内存 死锁,中断 - -## 4. 学习路线 - -我自己的学习路线规划:技能的主线是 **Java 语言基础 -> Spring 框架开发业务 -> 分布式系统解决高并发,基础方面 算法,网络协议,操作系统** - -概念性的程度:了解是啥,能够口述含义 -使用的程度:可以熟练使用,比如调用 API,写 SQL 查询 -原理的程度:能够讲清楚底层实现 -提出见解的程度:从任意技术可以引申出相关技术,并能够分析联系和区别,提出自己的见解和体会 -以上四种程度逐层加深,当然越深越好,通常前两种程度只能称之为“了解”;而写上简历迎接考核的,至少需要掌握到「原理」的程度。 - -## 5. 参考书籍 - -《算法》(第四版)图以前章节 -《剑指 Offer》 -《Java 编程思想》 -《Java多线程编程核心技术》(高洪岩 著) -《Java 并发编程实战》 -《深入理解 Java 虚拟机》 -《Java 8 实战》 -《鸟哥的 Linux 私房菜》 -《MySQL 必知必会》 -《Maven 实战》 -《图解 HTTP》 -《敏捷软件开发》 -《架构探险-从零开始写 Java Web 框架》 -《Spring 3.x 企业应用开发实战》 -《Head First 设计模式》 -《大型网站技术架构》(李智慧 著) -《大型网站系统与 Java 中间件实践》 - -## 6. 面试技巧 - - diff --git a/interview/note.md b/interview/note.md index 8ac4179d..41e545ef 100644 --- a/interview/note.md +++ b/interview/note.md @@ -34,7 +34,9 @@ Java后端开发(大数据、分布式应用等) 顺丰科技 | 7.30 | 8.20 | | | 贝壳网 | 8.4 | 8.20 | 8.18 | 美团 | 8.6(内推) | 8.20 |
  • 第一批:9.6 19:00 (第一批未参加直面的) |
  • 第一批:8.16-9.5(内推的人)
  • 第二批:9.6-9.14(武汉现场面) - +招银网络 | 8.7(内推) | 8.20 | +小米科技 | 8.20(柚子妹内推) | 8.20 | 时间不详 +京东 | 8.4 | 8.20 |
  • 简历截止:8.30
  • 笔试时间 9.9
  • 面试时间 9.16-9.20
  • # 2 复习内容