From 914871ff18105818b744e8ab5b3c23678c410d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A8=B1=E4=B9=90=E4=B8=8D=E5=9C=A8=E7=BA=BF?= Date: Thu, 16 May 2019 00:00:18 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=B8=A4=E6=95=B0=E4=B9=8B=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\344\271\213\345\222\214.java" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 "algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" diff --git "a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" "b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" new file mode 100644 index 0000000..46d5167 --- /dev/null +++ "b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" @@ -0,0 +1,23 @@ +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/* + * @lc app=leetcode.cn id=1 lang=java + * + * [1] 两数之和 + */ +class Solution { + public int[] twoSum(int[] nums, int target) { + Map map = new HashMap<>(nums.length); + for (int i = 0; i < nums.length; i++) { + Integer index = map.get(target - nums[i]); + if (Objects.nonNull(index)) { + return new int[]{index, i}; + } + map.put(nums[i], i); + } + return null; + } +} + From 597b4f987e3a8858535355a0a24edc8d40d74e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A8=B1=E4=B9=90=E4=B8=8D=E5=9C=A8=E7=BA=BF?= Date: Fri, 17 May 2019 11:10:08 +0800 Subject: [PATCH 2/6] solution: LengthOfLongestSubstring --- .../LengthOfLongestSubstring.java | 37 +++++++++++++++++++ .../com.wxboot.algorithm.leetcode/TwoSum.java | 6 ++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java rename "algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" => algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/TwoSum.java (89%) diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java new file mode 100644 index 0000000..ed59677 --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java @@ -0,0 +1,37 @@ +package com.wxboot.algorithm.leetcode; + +import java.util.stream.IntStream; + +public class LengthOfLongestSubstring { + + + private int lengthOfLongestSubstring(String s) { + if (s.length() == 1) { + return 1; + } + + int[] bucket = new int[128]; + // 使用原生 for 速度会更快 + IntStream.iterate(0, n -> n + 1).limit(127).forEach(n -> bucket[n] = -1); + + char[] arr = s.toCharArray(); + int left = -1; + int max = 0; + for (int i = 0; i < arr.length; i++) { + int cur = bucket[arr[i]]; + if (cur != -1) { + left = cur > left ? cur : left; + } + + bucket[arr[i]] = i; + max = getMax(max, i - left); + } + + return max; + } + + private int getMax(int x, int y) { + return x > y ? x : y; + } + +} diff --git "a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/TwoSum.java similarity index 89% rename from "algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" rename to algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/TwoSum.java index 46d5167..1417db6 100644 --- "a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/1.\344\270\244\346\225\260\344\271\213\345\222\214.java" +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/TwoSum.java @@ -1,3 +1,5 @@ +package com.wxboot.algorithm.leetcode; + import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -7,7 +9,8 @@ * * [1] 两数之和 */ -class Solution { +public class TwoSum { + public int[] twoSum(int[] nums, int target) { Map map = new HashMap<>(nums.length); for (int i = 0; i < nums.length; i++) { @@ -19,5 +22,6 @@ public int[] twoSum(int[] nums, int target) { } return null; } + } From f8a931ae0053707984624f4dc938e35521e34f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A8=B1=E4=B9=90=E4=B8=8D=E5=9C=A8=E7=BA=BF?= Date: Fri, 17 May 2019 11:16:13 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=AD=A4=E5=9C=BA=E6=99=AFstream=E9=80=9F?= =?UTF-8?q?=E5=BA=A6=E8=BF=87=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LengthOfLongestSubstring.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java index ed59677..66dba6b 100644 --- a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java @@ -11,8 +11,12 @@ private int lengthOfLongestSubstring(String s) { } int[] bucket = new int[128]; - // 使用原生 for 速度会更快 - IntStream.iterate(0, n -> n + 1).limit(127).forEach(n -> bucket[n] = -1); + // 使用原生 for 速度会更快 8ms + for (int i = 0; i < bucket.length; i++) { + bucket[(char) i] = -1; + } + // 100ms + // IntStream.iterate(0, n -> n + 1).limit(127).forEach(n -> bucket[n] = -1); char[] arr = s.toCharArray(); int left = -1; From 0fbd6847c52f0cafba1bcb8b79be479aec48097f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A8=B1=E4=B9=90=E4=B8=8D=E5=9C=A8=E7=BA=BF?= Date: Fri, 17 May 2019 18:16:40 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=20solution:=20=E5=8F=8D=E8=BD=AC32?= =?UTF-8?q?=E6=95=B0=E4=BB=A5=E5=86=85=E6=95=B0=E5=AD=97=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReverseNumber.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java new file mode 100644 index 0000000..e51cb93 --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java @@ -0,0 +1,24 @@ +public class ReverseNumber { + + + private int reverseNumber(int number) { + String s = String.valueOf(number); + char[] arr = s.toCharArray(); + char minus = '-'; + + int start = 0; + if (arr[0] == minus) { + start = 1; + } + int mid = ((arr.length - start) / 2); + int right = arr.length - 1; + for (int i = start; i <= mid && right >= mid; i++, right--) { + char temp = arr[i]; + arr[i] = arr[right]; + arr[right] = temp; + } + Long result = Long.parseLong(String.valueOf(arr)); + return result > Integer.MAX_VALUE || result < Integer.MIN_VALUE ? 0 : result.intValue(); + } + +} \ No newline at end of file From 43fc255ba3a153a1c06d5237ecae766ead62e327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A8=B1=E4=B9=90=E4=B8=8D=E5=9C=A8=E7=BA=BF?= Date: Sun, 19 May 2019 16:24:06 +0800 Subject: [PATCH 5/6] =?UTF-8?q?solution:=20=E4=B8=A4=E6=95=B0=E7=9B=B8?= =?UTF-8?q?=E5=8A=A0=EF=BC=9B=E6=95=B4=E6=95=B0=E5=9B=9E=E6=96=87=E5=88=A4?= =?UTF-8?q?=E6=96=AD=EF=BC=9B=E6=95=B4=E6=95=B0=E5=8F=8D=E8=BD=AC=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AddTwoNumbers.java | 88 +++++++++++++++++++ .../IntIsPalindrome.java | 43 +++++++++ .../ReverseNumber.java | 2 + 3 files changed, 133 insertions(+) create mode 100644 algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/AddTwoNumbers.java create mode 100644 algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/IntIsPalindrome.java diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/AddTwoNumbers.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/AddTwoNumbers.java new file mode 100644 index 0000000..b49742b --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/AddTwoNumbers.java @@ -0,0 +1,88 @@ +package com.wxboot.algorithm.leetcode; + +/* + * @lc app=leetcode.cn id=2 lang=java + * + * [2] 两数相加 + */ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +public class AddTwoNumbers { + + public ListNode addTwoNumbers(ListNode l1, ListNode l2) { + ListNode sumNode = new ListNode(0); + ListNode sumNext = sumNode; + ListNode prev = null; + while (l1 != null || l2 != null) { + int sum = sumNext.val; + + if (l1 != null) { + sum += l1.val; + l1 = l1.next; + } + + if (l2 != null) { + sum += l2.val; + l2 = l2.next; + } + + sumNext.val = sum % 10; + sumNext.next = new ListNode(sum / 10); + prev = sumNext; + sumNext = sumNext.next; + } + if (sumNext.val == 0) { + prev.next = null; + sumNext = null; + } + + return sumNode; + } + + /** + * l1 l2 按自然数顺序排列相加,需先将l1 l2 反转,结果反转 + * 输入:(3 -> 4 -> 2) + (4 -> 6 -> 5) + * 输出:8 -> 0 -> 7 + * 原因:342 + 465 = 807 + * @param l1 + * @param l2 + * @return + */ + /* + public ListNode addTwoNumbers(ListNode l1, ListNode l2) { + l1 = converseList(l1); + l2 = converseList(l2); + System.out.println(l1.val); + ... + + } + + public ListNode converseList(ListNode head) { + if (head == null) return head; + ListNode prev = null; + ListNode next = null; + while(head.next != null) { + next = head.next; + head.next = prev; + prev = head; + head = next; + } + return head; + } + */ +} + +class ListNode { + int val; + ListNode next; + + ListNode(int x) { + val = x; + } +} diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/IntIsPalindrome.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/IntIsPalindrome.java new file mode 100644 index 0000000..f09da17 --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/IntIsPalindrome.java @@ -0,0 +1,43 @@ +package com.wxboot.algorithm.leetcode; + +public class IntIsPalindrome { + + public boolean isPalindrome(int x) { + if (x < 0) { + return false; + } + if (x < 10) { + return true; + } + + long y = reverseTwo(x); + return x == y; + } + + public long reverseTwo(int x) { + int quotient = x; + // 54321 -> 5432 1 -> 543 2 -> 54 3 -> 5 4-> 0 5 + long y = 0; + while (quotient > 0) { + y = quotient%10 + y*10; + quotient = quotient/10; + } + return y > Integer.MAX_VALUE ? 0 : y; + } + + public long reverseOne(int x) { + String s = String.valueOf(x); + char[] arr = s.toCharArray(); + // 12 1 123 1 1234 2 + int mid = (arr.length / 2); + for (int i = 0; i < mid; i++) { + char temp = arr[i]; + arr[i] = arr[arr.length - i - 1]; + arr[arr.length - i - 1] = temp; + } + + long y = Long.valueOf(String.valueOf(arr)); + return y > Integer.MAX_VALUE ? 0 : y; + } + +} \ No newline at end of file diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java index e51cb93..7220211 100644 --- a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java @@ -1,3 +1,5 @@ +package com.wxboot.algorithm.leetcode; + public class ReverseNumber { From 1a9cf78b47b70476a80578d34ed714a0ad926ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A8=B1=E4=B9=90=E4=B8=8D=E5=9C=A8=E7=BA=BF?= Date: Mon, 20 May 2019 01:25:03 +0800 Subject: [PATCH 6/6] =?UTF-8?q?solution:=20=E6=9C=80=E5=A4=A7=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E5=AD=90=E5=89=8D=E8=BE=8D;=20=E7=BD=97=E9=A9=AC?= =?UTF-8?q?=E6=95=B0=E8=BD=AC=E6=95=B0=E5=AD=97;=20=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E8=BE=93=E5=85=A5{}()[]=E6=98=AF=E5=90=A6=E7=AC=A6=E5=90=88?= =?UTF-8?q?=E8=A7=84=E5=88=99;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- algorithm-leetcode/pom.xml | 8 ++ .../LongestCommonPrefix.java | 94 +++++++++++++++++++ .../RomanToInt.java | 73 ++++++++++++++ .../SymbolIsValid.java | 55 +++++++++++ pom.xml | 3 +- 5 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LongestCommonPrefix.java create mode 100644 algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/RomanToInt.java create mode 100644 algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/SymbolIsValid.java diff --git a/algorithm-leetcode/pom.xml b/algorithm-leetcode/pom.xml index 55db042..c72cdaf 100644 --- a/algorithm-leetcode/pom.xml +++ b/algorithm-leetcode/pom.xml @@ -12,4 +12,12 @@ algorithm-leetcode + + + junit + junit + 4.12 + + + \ No newline at end of file diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LongestCommonPrefix.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LongestCommonPrefix.java new file mode 100644 index 0000000..424e200 --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LongestCommonPrefix.java @@ -0,0 +1,94 @@ +package com.wxboot.algorithm.leetcode; + +import org.junit.Test; + +/** + * Copyright ©2017-2018, wxboot.com. All Rights Reserved. + * + * @author 娱乐不在线 wxboot.com + * @version 1.0.0 + * @Description: + * @date Created in 2019/5/19 17:36 + */ +public class LongestCommonPrefix { + + + @Test + public void testOne() { + String[] arr = {"abcddddb", "abcdeggg", "abadeggg"}; + + String prefix = getPrefixStartCmp(arr); + System.out.println("prefix : " + prefix); + } + + /** + * 貌似正向比对比逆向比对要快一些 + * + * @param arr + * @return + */ + public String getPrefixStartCmp(String[] arr) { + if (arr.length == 0) { + return ""; + } + if (arr.length == 1) { + return arr[0]; + } + + int last = arr[0].length(); + for (int i = 0; i < arr.length - 1; i++) { + if (arr[i].length() == 0 || arr[i + 1].length() == 0) { + return ""; + } + + last = getMin(last, arr[i + 1].length()); + for (int j = 0; j < last; j++) { + if (arr[i].charAt(j) != arr[i + 1].charAt(j)) { + last = j; + } + } + } + + char[] prefixArr = new char[last]; + for (int i = 0; i < last; i++) { + prefixArr[i] = arr[0].charAt(i); + } + + return String.valueOf(prefixArr); + } + + public String getPrefixEndCmp(String[] arr) { + if (arr.length == 0) { + return ""; + } + if (arr.length == 1) { + return arr[0]; + } + + int last = arr[0].length(); + for (int i = 0; i < arr.length - 1; i++) { + if (arr[i].length() == 0 || arr[i + 1].length() == 0) { + return ""; + } + + last = getMin(last, arr[i + 1].length()); + + for (int j = last - 1; j >= 0; j--) { + if (arr[i].charAt(j) != arr[i + 1].charAt(j)) { + last = j; + } + } + } + + char[] prefixArr = new char[last]; + for (int i = 0; i < last; i++) { + prefixArr[i] = arr[0].charAt(i); + } + + return String.valueOf(prefixArr); + } + + public int getMin(int x, int y) { + return x > y ? y : x; + } +} \ No newline at end of file diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/RomanToInt.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/RomanToInt.java new file mode 100644 index 0000000..e1b0964 --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/RomanToInt.java @@ -0,0 +1,73 @@ +package com.wxboot.algorithm.leetcode; + +import org.junit.Test; + +/** + * Copyright ©2017-2018, wxboot.com. All Rights Reserved. + * + * @author 娱乐不在线 wxboot.com + * @version 1.0.0 + * @Description: + * @date Created in 2019/5/19 16:59 + */ +public class RomanToInt { + + @Test + public void testOne() { + int num = romanToInt("D"); + System.out.println("num : " + num); + + } + + public int romanToInt(String s) { + char[] x = new char[]{'M', 'D', 'C', 'L', 'X', 'V', 'I'}; + + int num = convert(s); + + return num; + } + + public int convert(String s) { + int[] romanArr = new int[127]; + romanArr['M'] = 1000; + romanArr['D'] = 500; + romanArr['C'] = 100; + romanArr['L'] = 50; + romanArr['X'] = 10; + romanArr['V'] = 5; + romanArr['I'] = 1; + + char[] arr = s.toCharArray(); + int prev = romanArr[arr[0]]; + + if (arr.length == 1) { + return prev; + } + + int num = 0; + for (int i = 1; i < arr.length; i++) { + int cur = romanArr[arr[i]]; + + if (prev < cur) { + num += cur - prev; + if (i < arr.length - 1) { + prev = romanArr[arr[++i]]; + } else { + prev = 0; + } + + } else { + num += prev; + prev = cur; + } + + if (i == arr.length - 1) { + num += prev; + } + System.out.println(arr[i] + ":" + prev + ":" + cur); + } + + return num; + } + +} diff --git a/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/SymbolIsValid.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/SymbolIsValid.java new file mode 100644 index 0000000..d16574f --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/SymbolIsValid.java @@ -0,0 +1,55 @@ +package com.wxboot.algorithm.leetcode; + +import org.junit.Test; + +import java.util.Stack; + +/** + * Copyright ©2017-2018, wxboot.com. All Rights Reserved. + * + * @author 娱乐不在线 wxboot.com + * @version 1.0.0 + * @Description: + * @date Created in 2019/5/20 0:47 + */ +public class SymbolIsValid { + + @Test + public void testOne() { + System.out.println(isValid("()")); + } + + public boolean isValid(String s) { + char[] arr = s.toCharArray(); + + Stack stack = new Stack<>(); + + boolean isValid = false; + for (int i = 0; i < arr.length; i++) { + if (arr[i] == '{') { + stack.push('}'); + } + if (arr[i] == '(') { + stack.push(')'); + } + if (arr[i] == '[') { + stack.push(']'); + } + + if (arr[i] == '}' || arr[i] == ')' || arr[i] == ']') { + if (stack.isEmpty()) { + return false; + } + + isValid = stack.pop() == arr[i]; + if (isValid) { + continue; + } + return false; + } + } + return isValid; + } + +} + diff --git a/pom.xml b/pom.xml index caabc1f..fe74cb3 100644 --- a/pom.xml +++ b/pom.xml @@ -8,11 +8,10 @@ 0.0.1-SNAPSHOT algorithm-leetcode - algorithm-leetcode pom - algorithm + algorithm-parent 算法题解过程