From 95609011da9c863c71008777ec46fb933db21937 Mon Sep 17 00:00:00 2001 From: nibnait Date: Sun, 29 Mar 2020 17:03:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AF=8F=E6=97=A5=E4=B8=80=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\243\266\351\227\256\351\242\230.java" | 71 +++++++++++++++++ ...\351\227\264\347\273\223\347\202\271.java" | 77 +++++++++++++++++++ ...\345\272\217\346\225\260\347\273\204.java" | 41 ++++++++++ ...\345\260\217\345\242\236\351\207\217.java" | 70 +++++++++++++++++ src/main/java/algorithm_practice/README.md | 1 + .../algorithm_practice/a_Sorting/f_Heap.java | 2 +- src/main/test/Main.java | 44 +---------- .../\345\217\215\345\260\204.java" | 10 ++- ...\345\240\206\346\216\222\345\272\217.java" | 38 +++++++++ 9 files changed, 306 insertions(+), 48 deletions(-) create mode 100644 "src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" create mode 100644 "src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" create mode 100644 "src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" create mode 100644 "src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" "b/src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" new file mode 100644 index 00000000..98e5435c --- /dev/null +++ "b/src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" @@ -0,0 +1,71 @@ +package algorithm_practice.LeetCode.code300; + +import junit.framework.TestCase; +import org.junit.Test; + +/* +有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? + +如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。 + +你允许: + +装满任意一个水壶 +清空任意一个水壶 +从一个水壶向另外一个水壶倒水,直到装满或者倒空 +示例 1: (From the famous "Die Hard" example) + +输入: x = 3, y = 5, z = 4 +输出: True +示例 2: + +输入: x = 2, y = 6, z = 5 +输出: False + + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/water-and-jug-problem +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 +Created by nibnait on 2020-03-21 + */ +public class M365_水壶问题 extends TestCase { + + @Test + public void testCase() { + int x = 3, y = 5, z = 6; + System.out.println(canMeasureWater(x, y, z)); + + int x1 = 2, y1 = 6, z2 = 5; + System.out.println(canMeasureWater(x1, y1, z2)); + + + } + + public boolean canMeasureWater(int x, int y, int z) { + + if (x == z || y == z || z == 0) { + return true; + } + + if (z > x + y) { + return false; + } + + int gcd; + if (x == 0 || y == 0) { + gcd = x + y; + } else { + gcd = getGcd(x, y); + } + + return z % gcd == 0; + } + + private int getGcd(int x, int y) { + if (x % y == 0) { + return y; + } + return getGcd(y, x % y); + } + +} diff --git "a/src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" "b/src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" new file mode 100644 index 00000000..076b0502 --- /dev/null +++ "b/src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" @@ -0,0 +1,77 @@ +package algorithm_practice.LeetCode.code800; + +import common.datastruct.ListNode; +import common.util.ConstructListNode; +import common.util.SysOut; +import junit.framework.TestCase; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/* +给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 + +如果有两个中间结点,则返回第二个中间结点。 + +  + +示例 1: + +输入:[1,2,3,4,5] +输出:此列表中的结点 3 (序列化形式:[3,4,5]) +返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。 +注意,我们返回了一个 ListNode 类型的对象 ans,这样: +ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL. +示例 2: + +输入:[1,2,3,4,5,6] +输出:此列表中的结点 4 (序列化形式:[4,5,6]) +由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。 +  + +提示: + +给定链表的结点数介于 1 和 100 之间。 + + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/middle-of-the-linked-list +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 +Created by nibnait on 2020-03-24 + */ +public class E876_链表的中间结点 extends TestCase { + + @Test + public void testCase() { + + int[] nums = new int[]{1, 2, 3, 4, 5}; + SysOut.printList(middleNode(ConstructListNode.construct(nums))); + + int[] nums1 = new int[]{1, 2, 3, 4, 5, 6}; + SysOut.printList(middleNode(ConstructListNode.construct(nums1))); + + } + + /** + * 本题考查的是双指针诶~~ + * @param head + * @return + */ + + public ListNode middleNode(ListNode head) { + + if (head == null) { + return null; + } + + List nodeList = new ArrayList<>(); + + while (head != null) { + nodeList.add(head); + head = head.next; + } + + return nodeList.get(nodeList.size()/2); + } +} diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" "b/src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" new file mode 100644 index 00000000..4abe034e --- /dev/null +++ "b/src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" @@ -0,0 +1,41 @@ +package algorithm_practice.LeetCode.code900; + +import junit.framework.TestCase; +import org.junit.Test; + +/* +给你一个整数数组 nums,请你将该数组升序排列。 + +  + +示例 1: + +输入:nums = [5,2,3,1] +输出:[1,2,3,5] +示例 2: + +输入:nums = [5,1,1,2,0,0] +输出:[0,0,1,1,2,5] +  + +提示: + +1 <= nums.length <= 50000 +-50000 <= nums[i] <= 50000 + + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/sort-an-array +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 +Created by nibnait on 2020-03-31 + */ +public class M912_排序数组 extends TestCase { + + @Test + public void testCase() { + + } + + + +} diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" "b/src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" new file mode 100644 index 00000000..039a6830 --- /dev/null +++ "b/src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" @@ -0,0 +1,70 @@ +package algorithm_practice.LeetCode.code900; + +import junit.framework.TestCase; +import org.junit.Test; + +import java.util.Arrays; + +/* +给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 + +返回使 A 中的每个值都是唯一的最少操作次数。 + +示例 1: + +输入:[1,2,2] +输出:1 +解释:经过一次 move 操作,数组将变为 [1, 2, 3]。 +示例 2: + +输入:[3,2,1,2,1,7] +输出:6 +解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 +可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。 +提示: + +0 <= A.length <= 40000 +0 <= A[i] < 40000 + + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 +Created by nibnait on 2020-03-22 + */ +public class M945_使数组唯一的最小增量 extends TestCase { + + @Test + public void testCase() { + + int[] A = new int[]{1, 2, 2}; + System.out.println(minIncrementForUnique(A)); + + int[] A1 = new int[]{3, 2, 1, 2, 1, 7}; + System.out.println(minIncrementForUnique(A1)); + + + } + + /** + * 1. 先排序 + * 2. 如果(前一项A[i-1] == 后一项A[i]) + * 则将A[i-1]加到A[i]+1 + * A[i] = A[i-1] +1 + * + * A[i-1] > A[i] 也是同理 + */ + public int minIncrementForUnique(int[] A) { + Arrays.sort(A); + + int move = 0; + for (int i = 1; i < A.length; i++) { + if (A[i - 1] >= A[i]) { + move += A[i - 1] - A[i] + 1; + A[i] = A[i - 1] + 1; + } + } + + return move; + } +} diff --git a/src/main/java/algorithm_practice/README.md b/src/main/java/algorithm_practice/README.md index f08de7d1..e3027d29 100644 --- a/src/main/java/algorithm_practice/README.md +++ b/src/main/java/algorithm_practice/README.md @@ -10,6 +10,7 @@ - [M016_最接近的三数之和](./LeetCode/code000/M016_最接近的三数之和.java) - [M015_三数之和](./LeetCode/code000/M015_三数之和.java) - [E674_最长连续递增序列](./LeetCode/code600/E674_最长连续递增序列.java) + - [E876_链表的中间结点](./LeetCode/code800/E876_链表的中间结点.java) ## 滑动窗口 - [M567_字符串的排列](./LeetCode/code500/M567_字符串的排列.java) diff --git a/src/main/java/algorithm_practice/a_Sorting/f_Heap.java b/src/main/java/algorithm_practice/a_Sorting/f_Heap.java index 208689b1..3e767f46 100644 --- a/src/main/java/algorithm_practice/a_Sorting/f_Heap.java +++ b/src/main/java/algorithm_practice/a_Sorting/f_Heap.java @@ -28,7 +28,7 @@ public static int[] Heap_Sort(int[] a) { while (N > 0) { SwapUtil.swap(a, 0, N--); //将堆的最大元素a[0]和a[N]交换, - sink(a, 0, N); //调整堆, 知道堆空 + sink(a, 0, N); //调整堆, 直到堆空 SysOut.printArray(a); } diff --git a/src/main/test/Main.java b/src/main/test/Main.java index a3ee148d..794e2cb1 100644 --- a/src/main/test/Main.java +++ b/src/main/test/Main.java @@ -1,14 +1,7 @@ -import com.alibaba.fastjson.JSONObject; -import com.google.common.base.Functions; -import com.google.common.collect.Lists; -import common.datastruct.TreeNode; import junit.framework.TestCase; import org.junit.Test; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Stack; +import java.util.Arrays; /** * Created by nibnait on 2020-01-08 @@ -17,43 +10,8 @@ public class Main extends TestCase { @Test public void testCase() { - LinkedList queue = new LinkedList<>(); - queue.add(null); - queue.add(null); - queue.add(null); - queue.add(null); - - System.out.println(queue.isEmpty()); } - public String compressString(String S) { - Stack stack = new Stack(); - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < S.length(); i++) { - char c = S.charAt(i); - if (stack.isEmpty()) { - stack.push(c); - } else { - Character peek = stack.peek(); - if (peek.equals(c)) { - stack.push(c); - } else { - sb.append(peek).append(stack.size()); - stack.clear(); - - stack.push(c); - } - } - } - - if (!stack.isEmpty()) { - sb.append(stack.peek()).append(stack.size()); - } - - String result = sb.toString(); - return result.length() > S.length() ? S : result; - } } \ No newline at end of file diff --git "a/src/main/test/localtest/advanceTest/\345\217\215\345\260\204.java" "b/src/main/test/localtest/advanceTest/\345\217\215\345\260\204.java" index 5ce9e1e3..8586376d 100644 --- "a/src/main/test/localtest/advanceTest/\345\217\215\345\260\204.java" +++ "b/src/main/test/localtest/advanceTest/\345\217\215\345\260\204.java" @@ -13,7 +13,9 @@ public class 反射 extends TestCase { @Data class Person { - private int age; + public int age; + + public String phone; String getName() { return "xxx"; @@ -50,10 +52,10 @@ public void testCase() throws IllegalAccessException { for (int i = 0; i < fields.length; i++) { String name = fields[i].getName(); System.out.println(name); - int age = fields[i].getInt(person); + String age =String.valueOf(fields[i].get(person)); System.out.println(age); - fields[i].setInt(person, 2); - fields[i].setAccessible(true); +// fields[i].setInt(person, 2); +// fields[i].setAccessible(true); } } diff --git "a/src/main/test/practice/\345\240\206\346\216\222\345\272\217.java" "b/src/main/test/practice/\345\240\206\346\216\222\345\272\217.java" index 2f4117c8..e956bd87 100644 --- "a/src/main/test/practice/\345\240\206\346\216\222\345\272\217.java" +++ "b/src/main/test/practice/\345\240\206\346\216\222\345\272\217.java" @@ -23,8 +23,46 @@ public void testCase() { } private int[] heapSort(int[] nums) { + int lastIndex = nums.length - 1; + + for (int i = lastIndex / 2; i >= 0; i--) { + sink(nums, i, lastIndex); + } + + + while (lastIndex > 0) { + swap(nums, 0, lastIndex); + + lastIndex--; + + sink(nums, 0, lastIndex); + } return nums; } + private void sink(int[] nums, int rootIndex, int lastIndex) { + while (rootIndex * 2 < lastIndex) { + int j = rootIndex * 2 + 1; + + if (j + 1 <= lastIndex && nums[j] < nums[j + 1]) { + j++; + } + + if (nums[rootIndex] < nums[j]) { + swap(nums, rootIndex, j); + rootIndex = j; + } else { + break; + } + + } + } + + private void swap(int[] nums, int i, int j) { + int temp = nums[i]; + nums[i] = nums[j]; + nums[j] = temp; + } + }