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
算法题解过程