一道面试题:1和2的数字序列

题目:

序列规律如下:

  • 1
  • 11
  • 21
  • 1211
  • 111221
  • 312211
  • ……

输入:一个整数K

输出:第K个字符串

分析:首先其实这个字符串的规律就有挺多人看不出来:它的规律是:下面字符串是对上面字符串的描述

第2个字符串描述第1个字符串有1个1,所以是11

第3个字符串描述第2个字符串有2个1,所以是21

第4个字符串描述第3个字符串有1个2和1个1,所以是1211

第5个字符串描述第4个字符串有1个1和1个2和2个1,所以是111221

第6个字符串描述第5个字符串有3个1和2个2和1个1,所以是312211,

(原题目是212211,那么理解就是这里如果超过2,还是要按2来,但是我觉得按3来更好)

……

代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string num2string(int x){  //注意可能有双位数字的出现
 string ret = "";
 while (x){
  ret += x % 10 + '0';
  x /= 10;
 }
 reverse(ret.begin(), ret.end());
 return ret;
}
string getAns(string pre){//通过前一个数字序列获得下一个数字序列
 string ret = "";
 int count = 1;
 for (int i = 0; i < pre.size(); i++){
  if (i == pre.size() - 1 || pre[i] != pre[i + 1]){  //注意零界条件
   ret += num2string(count);
   ret += pre[i];
   count = 1;
  }
  else{
   count++;
  }
 }
 return ret;
}
string ans[21];
int main(){
 ans[1] = "1";
 for (int i = 2; i <= 10; i++){
  ans[i] = getAns(ans[i - 1]);
 }
 for (int i = 1; i <= 10; i++){
  cout << ans[i] << endl;
 }
 return 0;
}

运行结果:




——Apie陈小旭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值