【Fibonacci数列】、【分苹果】、【连续子数组的最大和】、【回文串】

题目一:
Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把
当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

int StepNumber(int num)
{
	if (num < 0) { return 0; }
	int step = 0, prev = 0, cur = 1;
	while(cur <= num) {
		if (prev == num || cur == num) {
			return step;
		}
		int tmp = cur;
		cur += prev;
		prev = tmp;
	}
	return (num - prev) > (cur - num) ? (cur - num) : (num - prev);
}
int  main()
{
	int a = StepNumber(0);
	return 0;
}

第二题:
n 只奶牛坐在一排,每个奶牛拥有 a 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿
走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。

int MoveApple(int sum, vector<int> array, bool exit_even, bool exit_uneven) {

	int step = 0, average = 0;
	average = sum / array.size();
	if (average * array.size() != sum || (average & 1) == true && exit_even || (average & 1) == false && exit_uneven)
		return -1;
	for (int i = 0; i < array.size(); i++){
		if (array[i] != average) {	
			int j = i + 1;
			while (array[i] != average) {
				if (array[i] < average) {
					if (array[j] <= average || array[j] - 2 < average) {
						++j;
						continue;
					}
					array[j] -= 2;
					array[i] += 2;
					step += 1;
				}
				else{
					if (array[j] >= average || array[j] + 2 > average) {
						++j;
						continue;
					}
					array[j] += 2;
					array[i] -= 2;
					step += 1;
				}
			}
		}
	}
	return step;
}
int main()
{
	int cow_num = 0, sum= 0;
	bool exit_uneven = false, exit_even = false;
	vector<int> array;
	cin >> cow_num;
	for (int i = 0; i < cow_num; ++i) {
		int tmp = 0;
		cin >> tmp;
		if (tmp & 1)
			exit_uneven = true;
		else
			exit_even = true;
		sum += tmp;
		array.push_back(tmp);
	}
	cout << MoveApple(sum, array, exit_even, exit_uneven);
	return 0;
}

第三题:
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子
向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连
续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
输入描述:

int FindGreatestSumOfSubArray(vector<int> array) {
	int max = array[0];
	for (int begin = 0; begin < array.size(); begin++)
	{
		if (array[begin] > max)
			max = array[begin];
		if (array[begin] >= 0)
		{
			int tmp = 0;
			for (int cur = begin; cur < array.size();cur++)
			{
				tmp += array[cur];
				if (tmp < 0)
					break;
				else if (tmp > max)
					max = tmp;
			}
		}
	}
	return max;
}

题目四:
给定一个字符串,问是否能通过添加一个字母将其变为回文串。
输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10
输出描述:
输出答案(YES\NO)

string CheckString(string str)
{
	int once_move = 0;
	size_t begin = 0;
	size_t end = str.size() - 1;
	while (begin < end) {
		if (str[begin] != str[end]) {
			if (str[begin] == str[end - 1])
				--end;
			else
				++begin;
			if (++once_move > 1) {
				return "NO";
			}
			continue;
		}
		++begin;
		--end;
	}
	return "YES";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值