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/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/LengthOfLongestSubstring.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java new file mode 100644 index 0000000..66dba6b --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/LengthOfLongestSubstring.java @@ -0,0 +1,41 @@ +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 速度会更快 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; + 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/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/ReverseNumber.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java new file mode 100644 index 0000000..7220211 --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/ReverseNumber.java @@ -0,0 +1,26 @@ +package com.wxboot.algorithm.leetcode; + +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 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/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/TwoSum.java b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/TwoSum.java new file mode 100644 index 0000000..1417db6 --- /dev/null +++ b/algorithm-leetcode/src/main/java/com.wxboot.algorithm.leetcode/TwoSum.java @@ -0,0 +1,27 @@ +package com.wxboot.algorithm.leetcode; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/* + * @lc app=leetcode.cn id=1 lang=java + * + * [1] 两数之和 + */ +public class TwoSum { + + 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; + } + +} + 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 算法题解过程