JS 1
我最开始的想法就是这样,写一个求外观数的函数,然后在主函数里调用,但是写着写着就想用起递归,结果越写越错卡了半天最后还是妥协用了for循环。。。(被自己菜到)
/**
* @param {number} n
* @return {string}
*/
var Waiguan = function(origin) {
let first = '';
let count = 1;
let result = "";
for (let i = 0; i < origin.length; i++) {
if (first !== origin[i]) {
first = origin[i];
}
if (first == origin[i + 1]) {
count++;
} else {
result = result + count + first;
count = 1;
}
}
return result;
}
var countAndSay = function(n) {
let result = '1';
if(n==1){
return '1';
}else{
for(let i=0;i<n-1;i++){
result=Waiguan(result);
}
return result;
}
};
JS 2
因为递归出错,想用全局变量let一个数组来存每层的数最后取出来弥补,结果LeetCode用全局会出错,不知道这个坑啊,我还在vs测试了好几次,反复提交,直到看到LeetCode说不建议用全局。。。
然后又想到歪门邪道给js的数组来个属性存值,结果直接LeetCode报错(vs可用)。
/**
* @param {number} n
* @return {string}
*/
let Waiguan = function(n,origin) {
let first = '';
let count = 1;
let result = "";
for (let i = 0; i < origin.length; i++) {
if (first !== origin[i]) {
first = origin[i];
}
if (first == origin[i + 1]) {
count++;
} else {
result = result + count + first;
count = 1;
}
}
Waiguan(n,result);
Waiguan.n.push(result);
}
Waiguan.n=[];
var countAndSay = function(n) {
if(n==1){
return '1';
}else{
Waiguan(n-1,'1');
return Waiguan.n[0];
}
};
JS 正宗递归!
var countAndSay = function(n) {
if(n==1){
return n.toString()
}
var tempArr = countAndSay(n-1).match(/(\d)\1*/g) // 该正则进行相同分组,调用match方法得出接下来用的数组
var result = ""
tempArr.forEach((item)=>{ // 循环上面得到的数组,然后取每个的长度(题里说的几个),还有第一个数字(题里说的哪个数)
var lth = item.length.toString()
var num = item.substring(0,1)
result = result+lth+num
})
return result //最后返回结果
};
python
class Solution:
def countAndSay(self, n: int) -> str:
if n == 1:
return '1'
if n == 2:
return '11'
if n == 3:
return '21'
if n>3:
s = '21'
for i in range(n-3):
val,c = s[0],1
r = ''
for j in range(1,len(s)):
if s[j] != val:
r += str(c)+val
val,c = s[j],1
else:
c += 1
s = r + str(c)+val
return s
经过一番洗礼,发现递归都写不明白了,真的得好好刷算法了,递归教我做人。。。QAQ