某互联网公司笔试题

haoruifly1 2012-11-18 02:32:20
有一组数字,如[24,32,2,4,65,-3,0,2,...],和一个给定整数a
是否存在其中的一个或者几个数,它们的和等于a
请实现方法int findNInt(int *original,int count,int a),存在返回1,否则返回0
...全文
214 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
彭家老三 2012-11-19
  • 打赏
  • 举报
回复
抱歉4楼代码再更新一下。递归虽然效率低点,但不需要排序。
int findNInt(int *original,int count,int a)
{
	if(count > 0)
	{
		if( original[0] == a)
		{
			return 1;
		}
		else if(findNInt(original+1, count-1, a) == 1)
		{
			return 1;
		}
		else if(findNInt(original+1, count-1, a-original[0]) == 1)
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
	else
	{
		return 0;
	}
}
LA_Lai 2012-11-18
  • 打赏
  • 举报
回复
先用快速排序算法对数组进行排序,然后先查找里面是否有值等于A,若有,选择A之前的区间,进行组合,若无,则选择数组中小于A的数的区间,进行组合
earn666 2012-11-18
  • 打赏
  • 举报
回复
递归法是众所周知的效率低下,而且此题使用递归法难以理解也极易出错。 题解如下:

#include <stdio.h>
#include <math.h>

void PrintResult(int *arr, int count, int a);
int findNInt(int *original,int count,int a);

int main(int argc, char *argv[]) {
	int arr1[4] = {1, 3, 5, 7};
	int arr2[4] = {2, 4, 6, 8};
	
	PrintResult(arr1, 4, 8);
	PrintResult(arr1, 4, 13);
	PrintResult(arr2, 4, 8);
	PrintResult(arr2, 4, 13);
	
	return 0;
}

void PrintResult(int *arr, int count, int a) {
	int i;
	
	for (i = 0; i < count; i++)
		printf("%d ", arr[i]);
	printf(": %d\t", a);
	if (findNInt(arr, count, a))
		printf("Found!\n");
	else
		printf("Can't.\n");
}

int findNInt(int *original,int count,int a) {
	unsigned TT = exp2(count), tt, t;
	int sum;
	int j;
	
	for (tt = 0; tt < TT; tt++) {
		sum = 0;
		for (j = 0, t = tt; j < count; j++, t /= 2)
			if (t % 2)
				sum += original[j];
		if (sum == a)
			return 1;
	}
	return 0;
}
测试输出:

1 3 5 7 : 8     Found!
1 3 5 7 : 13    Found!
2 4 6 8 : 8     Found!
2 4 6 8 : 13    Can't.
彭家老三 2012-11-18
  • 打赏
  • 举报
回复
引用 3 楼 pengjialaosan 的回复:
C/C++ code?123456789101112131415int findNInt(int *original,int count,int a){ if(count > 0) { int tmp = original[0]; if( tmp == a) return 1; else if(f……
sorry ,更正一下:那个tmp不应该用:
int findNInt(int *original,int count,int a)
{
	if(count > 0)
	{
		if( original[0] == a)
			return 1;
		else if(findNInt(original+1, count-1, a) == 1)
			return 1;
		else if(findNInt(original+1, count-1, a-original[0]) == 1)
			return 1;
		else
			return 0;
	}
}
但依然不敢确认是否正确。
彭家老三 2012-11-18
  • 打赏
  • 举报
回复
int findNInt(int *original,int count,int a)
{
	if(count > 0)
	{
		int tmp = original[0];
		if( tmp == a)
			return 1;
		else if(findNInt(original+1, count-1, a) == 1)
			return 1;
		else if(findNInt(original+1, count-1, a-tmp) == 1)
			return 1;
		else
			return 0;
	}
}
根据1楼的思想写的,不确认是否正确。
彭家老三 2012-11-18
  • 打赏
  • 举报
回复
引用 1 楼 JiMoKuangXiangQu 的回复:
先排序一下,然后选择值小于a的区间递归减治应该就能行了吧。 如: 目的数为5,而输入数据为1, 2, 3, 4, 5, 100(排序后),锁定区间[1,2,3,4,5], 然后从1开始,用5 - 1得4,递归寻找剩下的4个数字里面能凑成4的,继续递归直至一遍完成。如果没找到, (当然,这里第一下就能找到),然后区间继续缩小为[2,3,4,5]... 个人意见……
1楼方法应该可行,但楼主给出的数组是有负数存在的,所以应该没有必要“选择值小于a的区间”。
JiMoKuangXiangQu 2012-11-18
  • 打赏
  • 举报
回复
先排序一下,然后选择值小于a的区间递归减治应该就能行了吧。 如: 目的数为5,而输入数据为1, 2, 3, 4, 5, 100(排序后),锁定区间[1,2,3,4,5], 然后从1开始,用5 - 1得4,递归寻找剩下的4个数字里面能凑成4的,继续递归直至一遍完成。如果没找到, (当然,这里第一下就能找到),然后区间继续缩小为[2,3,4,5]... 个人意见,仅供参考。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧