Skip to content

Commit 6be6b68

Browse files
authored
Merge pull request gzc426#149 from Syuan-Cheng/master
syuan
2 parents 7d7a739 + e374546 commit 6be6b68

File tree

6 files changed

+430
-0
lines changed

6 files changed

+430
-0
lines changed

2018.11.24-leetcode28/syuan.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
```
2+
class Solution {
3+
public int strStr(String haystack, String needle) {
4+
if(needle.length() == 0)
5+
return 0;
6+
char [] charArrayhaystack = haystack.toCharArray();
7+
char [] charArrayneedle = needle.toCharArray();
8+
for(int i =0;i<charArrayhaystack.length;i++)
9+
{
10+
if(charArrayhaystack[i] == charArrayneedle[0])
11+
{
12+
int j = i + 1;
13+
int k = 1;
14+
for(k=1;k<charArrayneedle.length && j < charArrayhaystack.length;k++)
15+
{
16+
if(charArrayhaystack[j] == charArrayneedle[k])
17+
{
18+
j++;
19+
}else{
20+
break;
21+
}
22+
}
23+
if(k == charArrayneedle.length)
24+
return i;
25+
}
26+
}
27+
return -1;
28+
}
29+
}
30+
```

2018.11.25-leetcode80/syuan.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
##### 题目
2+
3+
```
4+
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
5+
6+
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
7+
8+
示例 1:
9+
10+
给定 nums = [1,1,1,2,2,3],
11+
12+
函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
13+
14+
你不需要考虑数组中超出新长度后面的元素。
15+
16+
示例 2:
17+
18+
给定 nums = [0,0,1,1,1,1,2,3,3],
19+
20+
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
21+
22+
你不需要考虑数组中超出新长度后面的元素。
23+
24+
说明:
25+
26+
为什么返回数值是整数,但输出的答案是数组呢?
27+
28+
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
29+
30+
你可以想象内部操作如下:
31+
32+
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
33+
int len = removeDuplicates(nums);
34+
35+
// 在函数里修改输入数组对于调用者是可见的。
36+
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
37+
for (int i = 0; i < len; i++) {
38+
print(nums[i]);
39+
}
40+
```
41+
##### 代码
42+
43+
```
44+
class Solution {
45+
public int removeDuplicates(int[] nums) {
46+
int count=0;
47+
if (nums.length==1) {
48+
return 1;
49+
}
50+
if (nums.length==0) {
51+
return 0;
52+
}
53+
if (nums.length==2) {
54+
return 2;
55+
}
56+
int i=0;
57+
int j=i;
58+
int tempCount=0;
59+
while(i<nums.length)
60+
{
61+
if (j<nums.length && nums[j]==nums[i]) {
62+
j++;
63+
tempCount++;
64+
}else{
65+
if (tempCount>=2) {
66+
count+=2;
67+
nums[i+1]=nums[i];
68+
i=i+2;
69+
}else{
70+
count++;
71+
i++;
72+
}
73+
if (j>=nums.length) {
74+
break;
75+
}
76+
nums[i]=nums[j];
77+
tempCount=0;
78+
}
79+
}
80+
return count;
81+
}
82+
}
83+
```

2018.11.26-leetcode11/syuan.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
##### 题目
2+
3+
```
4+
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
5+
6+
说明:你不能倾斜容器,且 n 的值至少为 2。
7+
```
8+
![微信截图_20181127122321](2DF0C29B574D4A30BFAB06ABDF185FA9)
9+
```
10+
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
11+
示例:
12+
13+
输入: [1,8,6,2,5,4,8,3,7]
14+
输出: 49
15+
```
16+
##### 思路
17+
双指针
18+
19+
##### 代码
20+
21+
```
22+
class Solution {
23+
public int maxArea(int[] height){
24+
int maxarea=0;
25+
int i=0;
26+
int j=height.length-1;
27+
28+
while(i<j){
29+
maxarea=Math.max(maxarea,Math.min(height[i],height[j])*(j-i));
30+
if(height[i]<height[j]){
31+
i++;
32+
}else{
33+
j--;
34+
}
35+
}
36+
return maxarea;
37+
}
38+
}
39+
```

2018.11.28-leetcode151/syuan.md

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
##### 题目
2+
```
3+
给定一个字符串,逐个翻转字符串中的每个单词。
4+
5+
示例:
6+
7+
输入: "the sky is blue",
8+
输出: "blue is sky the".
9+
10+
说明:
11+
12+
无空格字符构成一个单词。
13+
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
14+
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
15+
16+
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。
17+
```
18+
##### 思路
19+
- 先将整个字符串反转
20+
- 按照空格分成String数组
21+
- 每个单词反转
22+
##### 代码
23+
24+
```
25+
public class Solution {
26+
public String reverseWords(String s) {
27+
int length=s.length();
28+
//当字符串为空
29+
if(s == null){ return null;}
30+
//当字符串为" "时 直接返回null
31+
if(s.trim().equals("")){
32+
return s.trim();
33+
}
34+
35+
//1.反转整个字符串
36+
String allRevStr=ReverseWord(s);
37+
//2.获得每个单词
38+
String[] strChar=allRevStr.split(" ");
39+
40+
//3.反转每个字符串
41+
String reverse="";
42+
for (int i=0; i<strChar.length; ++i) {
43+
String temp=ReverseWord(strChar[i]);
44+
if (temp.equals("")) {
45+
continue;
46+
}
47+
48+
if (i==strChar.length-1) {
49+
reverse=reverse+temp;
50+
}else{
51+
reverse=reverse+temp+" ";
52+
}
53+
}
54+
return reverse;
55+
}
56+
57+
String ReverseWord(String s){
58+
//删除字符串前序和后继中的空格
59+
String str=s.trim();
60+
if (str.length()==1) {
61+
return str;
62+
}else if (str.equals("")) {
63+
return "";
64+
}else{
65+
StringBuilder sb=new StringBuilder(str);
66+
String revStr=sb.reverse().toString();
67+
return revStr;
68+
}
69+
}
70+
71+
}
72+
```
73+
74+
##### 改进方法
75+
76+
```
77+
public class Solution {
78+
public String reverseWords(String s) {
79+
int length=s.length();
80+
//当字符串为空
81+
if(s == null){ return null;}
82+
//当字符串为" "时 直接返回null
83+
if(s.trim().equals("")){
84+
return s.trim();
85+
}
86+
/**
87+
* 先将字符串按照空格分裂为字符串数组
88+
* 然后收尾两个指针来交换即可
89+
*/
90+
//0.掐头去尾
91+
String allRevStr=s.trim();
92+
//1.将字符串按照空格分裂为字符串数组
93+
String[] strChar=allRevStr.split(" ");
94+
95+
//2.使用首尾两个指针来交换
96+
int left=0;
97+
int right=strChar.length-1;
98+
String temStr=null;
99+
while(left<right){
100+
//交换
101+
temStr=strChar[left];
102+
strChar[left]=strChar[right];
103+
strChar[right]=temStr;
104+
//移动指针
105+
left++;
106+
right--;
107+
}
108+
//3.拼接好新的字符串
109+
String reverse="";
110+
for (int i=0; i<strChar.length; ++i) {
111+
//对每一个单词掐头去尾
112+
String temp=strChar[i].trim();
113+
114+
if (temp.equals("")) {
115+
continue;
116+
}
117+
118+
if (i==strChar.length-1) {
119+
reverse=reverse+temp;
120+
}else{
121+
reverse=reverse+temp+" ";
122+
}
123+
}
124+
return reverse;
125+
}
126+
}
127+
```

2018.11.29-leetcode443/syuan.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
##### 题目
2+
```
3+
给定一组字符,使用原地算法将其压缩。
4+
5+
压缩后的长度必须始终小于或等于原数组长度。
6+
7+
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
8+
9+
在完成原地修改输入数组后,返回数组的新长度。
10+
```
11+
##### 思路
12+
设置两个指针i 和 j
13+
i是赋值指针
14+
j用来统计每次字符出现的次数
15+
16+
**难点**
17+
当次数为两位数时的写入
18+
19+
```
20+
char[] temArray=String.valueOf(count).toCharArray();
21+
int k=0;
22+
while (k<temArray.length) {
23+
chars[i++]=temArray[k++];
24+
}
25+
```
26+
一位数时的int和char转换
27+
28+
```
29+
chars[i++]=(char) (count + '0');
30+
```
31+
32+
##### 代码
33+
```
34+
class Solution {
35+
public int compress(char[] chars) {
36+
/**
37+
* 思路:
38+
* 遍历数组 统计每个字符出现的次数
39+
*/
40+
int length=chars.length;//数组长度
41+
if (length<=1) {
42+
return length;
43+
}
44+
45+
46+
int i=0,j=i,count=0;
47+
char temChar=chars[j];
48+
//i是赋值指针
49+
//j是计数指针
50+
while(j<length){
51+
temChar=chars[j];
52+
//个数和temChar相等的字符的个数
53+
while(j<length && chars[j]==temChar){
54+
j++;
55+
count++;
56+
}
57+
//当个数为1时 直接把temChar赋给数组chars
58+
if (count==1) {
59+
chars[i++]=temChar;
60+
}else {
61+
chars[i++]=temChar;
62+
//当个数为一位数
63+
if (count<10) {
64+
chars[i++]=(char) (count + '0');
65+
}else{//当个数大于一位数 借助字符数组
66+
char[] temArray=String.valueOf(count).toCharArray();
67+
int k=0;
68+
while (k<temArray.length) {
69+
chars[i++]=temArray[k++];
70+
}
71+
}
72+
}
73+
count=0;
74+
}
75+
return i;
76+
}
77+
}
78+
```
79+

0 commit comments

Comments
 (0)