LeetCode-Search Insert Position

首先,题意就把我搞蒙了,最后才发现下一个字符串是通过上一个字符串的某种规则生成的。所以,第一感觉是可以使用递归,还是要注意处理边界值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public String cas(int n){
if(n==1){
return "1";
}else if(n==2){
return "11";
}else{
String count=cas(n-1);
Character nowNum=count.charAt(0);
String res="";
int sameTime=1;
for(int i=1;i<count.length();i++){
if(count.charAt(i)==nowNum){
sameTime++;
}else{
res+=Integer.toString(sameTime)+nowNum;
nowNum=count.charAt(i);
sameTime=1;
}
if(i==count.length()-1){
res+=Integer.toString(sameTime)+nowNum;
}
}
return res;
}
}
public String countAndSay(int n) {
return cas(n);
}
}

但发现时间效率不高,只超过了不到 17%的人。

把递归改成循环,发现运行效率更低

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public String countAndSay(int n) {
String res="1";
if(n>=2)
res="11";
for(int i=3;i<=n;i++){
String tempRes="";
Character nowNum=res.charAt(0);
int sameTime=1;
for(int j=1;j<res.length();j++){
if(res.charAt(j)==nowNum){
sameTime++;
}else{
tempRes+=Integer.toString(sameTime)+nowNum;
nowNum=res.charAt(j);
sameTime=1;
}
}
tempRes+=Integer.toString(sameTime)+nowNum;
res=tempRes;
}
return res;
}
}

看了别人的代码,才知道 Java 有 StringBuilder 和 toCharArray 两个方法,可以使运行效率加快,打败了将近 50%的提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public String countAndSay(int n) {
String res="1";
if(n>=2)
res="11";
for(int i=3;i<=n;i++){
StringBuffer tempRes=new StringBuffer();
char[] resChar=res.toCharArray();
Character nowNum=resChar[0];
int sameTime=1;
for(int j=1;j<resChar.length;j++){
if(resChar[j]==nowNum){
sameTime++;
}else{
tempRes.append(Integer.toString(sameTime));
tempRes.append(nowNum);
nowNum=resChar[j];
sameTime=1;
}
}
tempRes.append(Integer.toString(sameTime));
tempRes.append(nowNum);
res=tempRes.toString();
}
return res;
}
}