剑指offer-57

和为S的数字

57.1输入一个递增数组和一个数字S,在数组中找两个数字使其和为S,如果有多对数字,输出一对即可

解法一:蛮力法,逐次累加

解法二:利用递增特点,从两边试探加起,如果两数字和大于S,右侧往左移动,如果两数字小于S,左侧往右移,直至找到一对数

bool FindNumbersWithSum(int data[], int length, int sum,int* num1, int* num2)
{
	if (data == nullptr || length <= 1 || num1==nullptr || num2==nullptr) return false;
	int start = 0;
	int end = length - 1;
	while (data[end] > sum) end--;
	while (start<end)
	{
		if (data[start] + data[end]>sum) end--;
		else if (data[start] + data[end] < sum) start++;
		else
		{
			*num1 = data[start];
			*num2 = data[end];
			return true;
		}
	}
	return false;
}

57.2和为s的连续正数数列,输入一个正数S,打印出所有和为S的连续正数数列(至少两个)

解法一:蛮力法,从1开始依次递减,能够成功减为0的数字则输出,否则从下一位重新开始,复杂

解法二:因为是连续的数字,最大的两个数应该在中间,如果s为偶数,数组内的值不大于x=s/2,如果S为奇数,数组内的值不大于x=(s+1)/2

从x开始作为右节点数,试探地移动左侧节点数,如果两节点数之间和大于S,右节点左移动,如果两节点数之间和小于S,左节点左移动,直至和为S,左节点为0,返回

void FindContinuousSequence(int sum)
{
	if (sum <= 2) return; 
	int big = 0;
	if (sum & 1)
		big = (sum + 1) >> 1;
	else
		big = sum >> 1;
	int small = big - 1;
	int tempSum = big + small;
	while (small>0)
	{
		if (small==big)
		{
			small--;
			tempSum += small;
		}
		else if (tempSum>sum)
		{
			tempSum -= big;
			big--;
		}
		else if (tempSum<sum)
		{
			small--;
			tempSum += small;
		}
		else
		{
			for (int i = small; i <= big;i++)
				printf("%d,", i);
			printf("\n");
			tempSum -= big;
			big--;
		}
	}
	return;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值