leetcode第38题

简介: 难在了题目是什么意思呢?初始值第一行是 1。第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312

image.png

难在了题目是什么意思呢?

初始值第一行是 1。

第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。

第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。

第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。

第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。

第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312211。

然后题目要求输入 1 - 30 的任意行数,输出该行是啥。

解法一 递归

可以看出来,我们只要知道了 n - 1 行,就可以写出第 n 行了,首先想到的就是递归。

第五行是 111221,求第六行的话,我们只需要知道每个字符重复的次数加上当前字符就行啦。

1 重复 3 次,就是 31,2 重复 2 次就是 22,1 重复 1 次 就是 11,所以最终结果就是 312211。

publicStringcountAndSay(intn) {
//第一行就直接输出if (n==1) {
return"1";
    }
//得到上一行的字符串Stringlast=countAndSay(n-1);
//输出当前行的字符串returngetNextString(last);
}
privateStringgetNextString(Stringlast) {
//长度为 0 就返回空字符串if (last.length() ==0) {
return"";
    }
//得到第 1 个字符重复的次数intnum=getRepeatNum(last);
// 次数 + 当前字符 + 其余的字符串的情况returnnum+""+last.charAt(0) +getNextString(last.substring(num));
}
//得到字符 string[0] 的重复个数,例如 "111221" 返回 3privateintgetRepeatNum(Stringstring) {
intcount=1;
charsame=string.charAt(0);
for (inti=1; i<string.length(); i++) {
if (same==string.charAt(i)) {
count++;
        } else {
break;
        }
    }
returncount;
}

时间复杂度:

空间复杂度:O(1)。

解法二 迭代

既然有递归,那就一定可以写出它的迭代形式。

publicStringcountAndSay(intn) {
Stringres="1";
//从第一行开始,一行一行产生while (n>1) {
Stringtemp="";
for (inti=0; i<res.length(); i++) {
intnum=getRepeatNum(res.substring(i));
temp=temp+num+""+res.charAt(i);
//跳过重复的字符i=i+num-1;
        }
n--;
//更新res=temp;
    }
returnres;
}
//得到字符 string[0] 的重复个数,例如 "111221" 返回 3privateintgetRepeatNum(Stringstring) {
intcount=1;
charsame=string.charAt(0);
for (inti=1; i<string.length(); i++) {
if (same==string.charAt(i)) {
count++;
        } else {
break;
        }
    }
returncount;
}

时间复杂度:

空间复杂度:O(1)。

递归里边又用了一个递归,我觉得这点有点意思。

相关文章
|
4月前
leetcode-1447:最简分数
leetcode-1447:最简分数
42 0
|
4月前
leetcode-827:最大人工岛
leetcode-827:最大人工岛
53 0
|
4月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
64 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
67 0
|
索引
leetcode 283 移动零
leetcode 283 移动零
50 0
|
测试技术
一和零(LeetCode-474)
一和零(LeetCode-474)
130 0
一和零(LeetCode-474)
|
算法 Java
一和零(LeetCode 474)
一和零(LeetCode 474)
87 0
|
算法
leetcode第45题
时间复杂度:O(n)。 空间复杂度:O(1)。 这里要注意一个细节,就是 for 循环中,i < nums.length - 1,少了末尾。因为开始的时候边界是第 0 个位置,steps 已经加 1 了。如下图,如果最后一步刚好跳到了末尾,此时 steps 其实不用加 1 了。如果是 i < nums.length,i 遍历到最后的时候,会进入 if 语句中,steps 会多加 1 。
leetcode第45题
leetcode第48题
将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。 解法一 可以先转置,然后把每列对称交换交换一下
leetcode第48题