Skip to content

Commit 1334f7a

Browse files
Merge pull request #39 from AAluoxiang/master
第一周作业#1
2 parents 7fde135 + f738939 commit 1334f7a

16 files changed

+975
-0
lines changed

Week_01/id_1/LeetCode_1021_1.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package week01;
2+
3+
import java.util.Stack;
4+
5+
/**
6+
* @创建人 luoxiang
7+
* @创建时间 2019/6/6 18:00
8+
* @描述 LeetCode : 1021. 删除最外层的括号 https://leetcode-cn.com/problems/remove-outermost-parentheses/
9+
*/
10+
public class RemoveOuterMostParenteses {
11+
12+
public static void main(String[] args) {
13+
String str = "(()())(())";
14+
String str2 = "(()())(())(()(()))";
15+
String str3 = "()()";
16+
System.out.println(new RemoveOuterMostParenteses().removeOuterParentheses2(str));
17+
System.out.println(new RemoveOuterMostParenteses().removeOuterParentheses2(str2));
18+
System.out.println(new RemoveOuterMostParenteses().removeOuterParentheses2(str3));
19+
}
20+
21+
/**
22+
* Method 1 : 使用 stack 来进行操作 。
23+
* ( 先判空,非空 则加入字符串中,在push;
24+
* ) 先pop,再判空,非空则加入 字符串中;
25+
* 时间复杂度 : O(N) ; 空间复杂度 : O(N)
26+
*/
27+
public String removeOuterParentheses(String S) {
28+
final Stack<Character> stack = new Stack<>();
29+
StringBuilder sb = new StringBuilder();
30+
for (char c : S.toCharArray()) {
31+
if (c == '(') {
32+
if (!stack.empty()) sb.append(c);
33+
stack.push(c);
34+
} else {
35+
stack.pop();
36+
if (!stack.empty()) sb.append(c);
37+
}
38+
}
39+
return sb.toString();
40+
}
41+
42+
/**
43+
* Method 2 : 用一个计数器 count 来保存; ( count++ ; ) count-- ;
44+
* 时间复杂度 : O(N) ; 空间复杂度 : O(1)
45+
*/
46+
public String removeOuterParentheses2(String S) {
47+
StringBuilder sb = new StringBuilder();
48+
int count = 0;
49+
for (char c : S.toCharArray()) {
50+
if (c == '(') {
51+
count++;
52+
if (count > 1) sb.append(c);
53+
} else {
54+
count--;
55+
if (count != 0) sb.append(c);
56+
}
57+
}
58+
return sb.toString();
59+
}
60+
61+
}

Week_01/id_1/LeetCode_1047_1.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package week01;
2+
3+
import java.util.Stack;
4+
5+
/**
6+
* @创建人 luoxiang
7+
* @创建时间 2019/6/6 12:41
8+
* @描述 LeetCode : 1047. 删除字符串中的所有相邻重复项 https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
9+
*/
10+
public class RemoveAllAdjacent {
11+
public static void main(String[] args) {
12+
final RemoveAllAdjacent adjacent = new RemoveAllAdjacent();
13+
System.out.println(adjacent.removeDuplicates2("abbaca"));
14+
}
15+
16+
/**
17+
* Method 1 : 使用堆栈 stack ;
18+
* 时间复杂度 : O(N*K*K) ; 空间复杂度:O(N)
19+
*/
20+
public String removeDuplicates(String S) {
21+
final Stack<Character> stack = new Stack<>();
22+
for (Character item : S.toCharArray()) {
23+
if (!stack.empty() && stack.peek() == item) {
24+
stack.pop();
25+
} else {
26+
stack.push(item);
27+
}
28+
}
29+
final StringBuilder builder = new StringBuilder();
30+
while (!stack.empty()) {
31+
builder.append(stack.pop());
32+
}
33+
return builder.reverse().toString();
34+
}
35+
36+
/**
37+
* Method 2 : 数组使用
38+
* 时间复杂度: O(S.length()) —> O(N) ; 空间复杂度: O(S.length) —> O(N)
39+
*/
40+
public String removeDuplicates2(String S) {
41+
final char[] chars = S.toCharArray();
42+
int top = 0;
43+
for (char c : chars) {
44+
if (top > 0 && chars[top - 1] == c) {
45+
top--;
46+
continue;
47+
}
48+
chars[top++] = c;
49+
}
50+
return new String(chars, 0, top);
51+
}
52+
53+
54+
}

Week_01/id_1/LeetCode_15_1.java

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package week01;
2+
3+
import java.util.*;
4+
5+
/**
6+
* @创建人 luoxiang
7+
* @创建时间 2019/6/5 16:34
8+
* @描述 LeerCode : 15. 三数之和 ; https://leetcode-cn.com/problems/3sum/
9+
*/
10+
public class ThreeSum {
11+
public static void main(String[] args) {
12+
final ThreeSum threeSum = new ThreeSum();
13+
int[] ints = {-1, 0, 1};
14+
int[] int2 = {-1, 0, 1, 2, -1, -4};
15+
int[] int3 = {0, 0, 0, 0};
16+
int[] int4 = {-4, -2, 1, -5, -4, -4, 4, -2, 0, 4, 0, -2, 3, 1, -5, 0};
17+
final List<List<Integer>> lists = threeSum.threeSum(ints);
18+
for (List<Integer> list : lists) {
19+
for (Integer integer : list) {
20+
System.out.print(integer + ",");
21+
}
22+
System.out.println();
23+
}
24+
System.out.println("-----------------------");
25+
final List<List<Integer>> lists2 = threeSum.threeSum(int2);
26+
for (List<Integer> list : lists2) {
27+
for (Integer integer : list) {
28+
System.out.print(integer + ",");
29+
}
30+
System.out.println();
31+
}
32+
System.out.println("-----------------------");
33+
final List<List<Integer>> lists3 = threeSum.threeSum(int3);
34+
for (List<Integer> list : lists3) {
35+
for (Integer integer : list) {
36+
System.out.print(integer + ",");
37+
}
38+
System.out.println();
39+
}
40+
System.out.println("-----------------------");
41+
final List<List<Integer>> lists4 = threeSum.threeSum(int4);
42+
for (List<Integer> list : lists4) {
43+
for (Integer integer : list) {
44+
System.out.print(integer + ",");
45+
}
46+
System.out.println();
47+
}
48+
System.out.println("----------------33333-------");
49+
final List<List<Integer>> lists5 = threeSum.threeSum3(int4);
50+
for (List<Integer> list : lists5) {
51+
for (Integer integer : list) {
52+
System.out.print(integer + ",");
53+
}
54+
System.out.println();
55+
}
56+
}
57+
58+
59+
/**
60+
* Method 1: 暴力法; 3 层循环 ——> 超时了......
61+
* 时间复杂度 : O(N*N*N+NlogN) ; 空间复杂度 : O(N)
62+
*/
63+
public List<List<Integer>> threeSum(int[] nums) {
64+
Arrays.sort(nums);
65+
List<List<Integer>> lists = new LinkedList<>();
66+
for (int i = 0; i < nums.length - 2 && nums[i] <= 0; i++) {
67+
if (i == 0 || i > 0 && nums[i] != nums[i - 1]) {
68+
for (int j = i + 1; j < nums.length - 1 && nums[i] + nums[j] <= 0; j++) {
69+
if ( nums[j] != nums[j + 1]) {
70+
for (int k = j + 1; k < nums.length; k++) {
71+
// if (k > 2 && nums[k] == nums[k - 1]) continue;
72+
if (nums[i] + nums[j] + nums[k] == 0) {
73+
List<Integer> list = Arrays.asList(nums[i], nums[j], nums[k]);
74+
lists.add(list);
75+
}
76+
}
77+
}
78+
}
79+
}
80+
}
81+
return lists;
82+
}
83+
84+
/**
85+
* 寻找新的解决方法
86+
* Method 3 : 排序后 ,再循环里面 ,从两边往中间 查找
87+
*/
88+
public List<List<Integer>> threeSum3(int[] nums) {
89+
Arrays.sort(nums);
90+
List<List<Integer>> lists = new LinkedList<>();
91+
for (int i = 0; i < nums.length - 2; i++) {
92+
if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) {
93+
94+
95+
int left = i + 1, right = nums.length - 1, needValue = 0 - nums[i];
96+
while (left < right) {
97+
if (needValue == (nums[left] + nums[right])) {
98+
if (!lists.contains(Arrays.asList(nums[i], nums[left], nums[right]))) {
99+
lists.add(Arrays.asList(nums[i], nums[left], nums[right]));
100+
}
101+
while (left < right && nums[right] == nums[right - 1]) right--;
102+
while (left < right && nums[left] == nums[left + 1]) left++;
103+
right--;
104+
left++;
105+
} else if (needValue < (nums[left] + nums[right])) {
106+
right--;
107+
} else {
108+
left++;
109+
}
110+
}
111+
}
112+
}
113+
return lists;
114+
}
115+
116+
}

Week_01/id_1/LeetCode_189_1.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package week01;
2+
3+
/**
4+
* @创建人 luoxiang
5+
* @创建时间 2019/6/4 9:41
6+
* @描述 LeetCode:189. 旋转数组 https://leetcode-cn.com/problems/rotate-array/
7+
*/
8+
public class RotateArray {
9+
public static void main(String[] args) {
10+
final RotateArray rotateArray = new RotateArray();
11+
int[] nums = new int[]{-1, -100, 3, 99};
12+
rotateArray.rotate(nums, 2);
13+
for (int num : nums) {
14+
System.out.print(num + ",");
15+
}
16+
}
17+
18+
/**
19+
* Function one :
20+
* k,两层循环, 第一层 数组 array; 第二层 k,要移动的位置
21+
* array[i] = array[length -1 ]
22+
* 时间复杂度 : O(k*n)
23+
* 空间复杂度 : O(1)
24+
*/
25+
public static void rotate1(int[] nums, int k) {
26+
if (nums.length == 0 || k == 0) {
27+
return;
28+
}
29+
int n = nums.length;
30+
k %= n;
31+
for (int j = 1; j <= k; j++) {
32+
int tempLast = nums[n - 1];
33+
for (int i = n - 1; i > 0; i--) {
34+
nums[i] = nums[i - 1];
35+
}
36+
nums[0] = tempLast;
37+
}
38+
}
39+
40+
/**
41+
* Function two:
42+
* 反转的思路:
43+
* 第一次: 全部反转 一遍
44+
* 接下来以 k 为节点 进行区分 reverse(nums,0,n-1)
45+
* 第二次: k 之前的 数据反转一遍 reverse(nums,0,k-1)
46+
* 第三次: k 之后的 数据也要反转一遍 reverse(nums,k,n-1)
47+
*
48+
* @param nums
49+
* @param k
50+
*/
51+
public void rotate(int[] nums, int k) {
52+
int n=nums.length;
53+
k %= n;
54+
reserve(nums,0,n-1);
55+
reserve(nums,0,k-1);
56+
reserve(nums,k,n-1);
57+
}
58+
59+
private void reserve(int[] nums, int start, int end) {
60+
while (start < end) {
61+
int temp = nums[start];
62+
nums[start] = nums[end];
63+
nums[end] = temp;
64+
start++;
65+
end--;
66+
}
67+
}
68+
69+
}

Week_01/id_1/LeetCode_1_1.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package week01;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* @创建人 luoxiang
8+
* @创建时间 2019/6/6 10:20
9+
* @描述 LeetCode: 1. 两数之和 https://leetcode-cn.com/problems/two-sum/
10+
*/
11+
public class TwoNum {
12+
public static void main(String[] args) {
13+
final TwoNum twoNum = new TwoNum();
14+
int[] nums={3, 2, 4};
15+
final int[] ints = twoNum.twoSum2(nums, 6);
16+
for (int anInt : ints) {
17+
System.out.print(anInt+",");
18+
}
19+
}
20+
21+
/**
22+
* Method 1 : 暴力法, 两层循环解决
23+
* 时间复杂度: O(N*N) ; 空间复杂度: O(N)
24+
*
25+
*/
26+
public int[] twoSum(int[] nums, int target) {
27+
for(int i=0;i<nums.length-1;i++){
28+
for(int j=i+1;j<nums.length;j++){
29+
if(target-nums[i]==nums[j]){
30+
return new int[]{i,j};
31+
}
32+
}
33+
}
34+
return new int[1];
35+
}
36+
37+
/**
38+
* Method 2 : 使用Map来进行存储,key: 数组下标 ; value: 数组下标对应的值; 循环一遍,并把值存储到map中,后面的循环来进行比较;
39+
* 时间复杂度: O(N) ; 空间复杂度: O(N) ;
40+
*/
41+
public int[] twoSum2(int[] nums, int target) {
42+
final Map<Integer, Integer> map = new HashMap<>();
43+
for(int i=0;i<nums.length;i++){
44+
int temp=target-nums[i];
45+
if(map.containsKey(temp)){
46+
return new int[]{map.get(temp),i};
47+
}
48+
map.put(nums[i],i);
49+
}
50+
return new int[0];
51+
}
52+
53+
}

0 commit comments

Comments
 (0)