Kolakoski序列的生成——搜狐2018研发类笔试编程题

本文介绍了一个使用C++实现的序列生成算法,该算法通过读取初始数值序列并根据特定规则生成新的数值序列。文中详细展示了如何利用vector容器和循环结构来实现这一过程,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出描述:

代码如下,菜鸟一枚,欢迎批评指正:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
//维护一个count数组,存放每一组输出元素的个数
//由于count[i]里存放的是第i组序列所输出的数的个数,所以遍历count的每一个元素,
//就能找到第i+1组序列需要输出的数的个数所在count数组中的位置,而根据count的下标
//就能确定那一组输出的值,就是第i+1组需要输出的元素个数
//不断地递增计数cnt,直到达到n退出
int main()
{
	int n;
	int m;
	int x;
	int i;
	int j;
	int k;
	int num = 0;
	int cnt = 0;
	vector<int> count;//维护一个数组,存放每一组输出的元素的个数
	vector<int> vm;
	while (cin >> n >> m) {
		vector<int>().swap(vm);
		if (n > 0 && n < 10000 && m > 1 && m < 1000) {
			for (i = 0;i < m;++i) {//输入用于生成序列的数,放在数组vm内
				cin >> x;
				if (x > 0 && x < 1000) {
					if (i > 0) {
						if ((x != vm[i - 1]) && (i != m - 1))
							vm.push_back(x);
						else if ((i == m - 1) && x != vm[0]) {
							vm.push_back(x);
						}
					}
					else if (i == 0)
						vm.push_back(x);
				}
			}

			vector<int>().swap(count);//清空维护的存放每一组输出几个数的数组
			while (n) {//一直循环输出,直到达到要求输出的项数n才退出
				if (count.size() == 0) {
					for (j = vm[0];j > 0;--j) {
						cout << vm[0] << endl;//输出vm[0]的值
						cnt++;
						if (cnt == n) {
							cnt = 0;
							n = 0;
							break;
						}
					}
					count.push_back(vm[count.size()]);//当输出的是序列第一组时,count[0]里存放vm[0]的值
				}
				else if (count.size() == 1 && vm[0] == 1) {
					int a;
					for (a = 0;a < vm[1];++a) {
						cout << vm[1] << endl;
						cnt++;
						if (cnt == n) {
							cnt = 0;
							n = 0;
							break;
						}
					}
					count.push_back(vm[1]);//当vm[0]是1的时候,count[1]存放的是vm[1]
				}
				else {
					for (k = 0; k < count.size();k++) {
						for (j = 0;j < count[k];++j) {
							num++;
							if (num == count.size() + 1) {
								num = 0;
								count.push_back(vm[k%m]);
								for (int a = 0;a < vm[k%m];++a) {
									cout << vm[(count.size() - 1) % m] << endl;
									cnt++;
									if (cnt == n) {
										cnt = 0;
										n = 0;
										break;
									}
								}
								k = count.size() - 1;
								break;
							}
						}
					}
				}
			}
		}
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值