2018搜狐笔试 Kolakoski数列问题

我尝试描述一下(如有错误还请指教):

比如数组【2,1,3,1】

第一个打印数子和次数都是数组第一个数字,可知为2

那么第一次打印为 :2,2

第二个打印数字为1(依次从数组中获取,循环获取,可用%),打印次数为2(这个2是从第一次的打印的第二个位置获取的)

那么第二次打印为:1,1                                                                                (加上第一次打印的结果为:2,2,1,1,这个结果很重要,因为后面的打印次数将从这里获取)

第三个打印数字为3,打印次数为打印结果(2,2,1,1)的第三个位置的数字1

那么第三次打印为:3                                                                                       (加上前2次打印的结果为:2,2,1,1,3)

第四个打印数字为1,打印次数为打印结果(2,2,1,1,3)的第四个位置的数字1

那么第四次打印为:1                                                                                       (加上前3次打印的结果为:2,2,1,1,3,1)

依此类推

但是对于数组【1,2】要注意特殊情况,结合代码看应该能明白。

void Kolakoski()

{
int n = 0, m = 0, count = 0;
cin >> n;
cin >> m;
vector<int>vec(m, 0);
for (int i = 0; i < m;++i)
{
cin >> vec[i];
}


int num = 0;//要打印的数字
int printNum = 0;//打印的次数
vector<int>vec2;//存放已打印的数字


for (int j = 0; j < n;++j)
{
num = vec[j%m];
if ((j + 1)>vec2.size())//注意这里,例如【1,2】的情况,第一打印后vec2只有1个数字,当j=1时,取值会发生异常,所以在vec里取打印次数
printNum = vec[j%m];
else 
printNum = vec2[j];
for (int i = 0; i <printNum; ++i)
{
cout << num << endl;
vec2.push_back(num);
++count;//统计一共打印了多少数字
if (count == n)return;
}

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值