`

算法设计:有n个数,范围是从1到n,且只有唯一的两个数相同,如何最快的求相同的这个数值?

 
阅读更多

为了方便问题描述,假设n = 10,即数组a[10]里有10个数,范围是从1到10,且里面只有两个数的值是相同的。如何求这个相同的数值。

常规思路:

1,先冒泡排序,然后用while循环找出这个相同的数值

2,直接用冒泡的思路,i从0到n-2,j = i+1,依次比,找出相同的数值。

上述复杂度都太高,而且没有充分利用到这里面的特殊条件:有且只有两个值是相同的。

事实上,可以对这个数组a[10]求和 = sum1,然后对从1到10进行求和 = sum2,然后求abs(sum1 - sum2),用这个数组的上界,这里是10 - abs(sum1 - sum2)得到的数值就是那个相同的数值。跟上面一次一次循环遍历相比,这里只是进行两次求和,然后做差,用上界值一减就得到了。

测试程序如下:

#include <stdio.h>

/*求数组里面n个元素的和*/
int getSum1(int a[], int n)
{
	int sum = 0;
	int i;
	for(i=0; i<n; i++)
		sum+=a[i];
	return sum;
}

/*求从a到b连续b-a+1个数之和*/
int getSum2(int a, int b)
{
	int sum = 0;
	int i;
	for(i = a; i<=b; i++)
		sum = sum+i;
	return sum;
}

/*求两个数做差后的绝对值*/
int getAbs(int a, int b)
{
	return a-b>0? a-b:b-a;
}

int main()
{
	
	int a[10] = {1, 10, 3, 4, 5, 6, 7, 8, 9, 10};
	int sum1 = getSum2(1, 10);
	int sum2 = getSum1(a, 10);
	int ret = 10 -getAbs(sum1, sum2);
	printf("sum1 = %d, sum2 = %d, ret = %d\n", sum1, sum2, ret);
	return 0;
}


分享到:
评论

相关推荐

    数据结构与算法图解.docx

    二叉树是一种特殊的树,其中每个节点最多有两个子节点,通常被称为左子节点和右子节点。二叉树的左子节点和右子节点的命名并不是固定的,可以互换。二叉树的每个父节点都有两个子节点,除了根节点。 AVL 树是一种自...

    数据结构(C++)有关练习题

    综合(课程设计) 内容及步骤: 1、假定一维数组a[n]中的每个元素值均在[0,200]区间内,用C++编写一个算法,分别统计出落在[0,20],[21,50],[51,80],[81,130],[131,200]等各区间内的元素个数。...

    RFID数据流近似去重

    在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。 在判断a是否属于这个集合时,我们对a应用k次哈希函数,如果所有hi(a)的位置都是1(1≤i≤k),那么我们就认为a是集合中的元素,否则就认为a不是...

    DES数据加密

    基本上说,如果 a映射到b,那么b一定可以映射到a,所以b[a[n]] = n.(n是一个在0到255之间的数)。在一个循环中赋值,使用一个256字节的解码表它对应于我们刚才在上一步产生的256字节的加密表。 使用这个方法,...

    软件工程-理论与实践(许家珆)习题答案

     软件特征:只有程序、程序设计概念,不重视程序设计方法。  ② 程序系统阶段。  硬件特征:速度、容量及工作可靠性有明显提高,价格降低,销售有爆炸性增长 。  软件特征:程序员数量猛增,开发人员素质低。  ...

    Oracle9i的init.ora参数中文说明

    并确保在同一事务处理种对相同数据的两次查询看到的是相同的值。 值范围: TRUE | FALSE 默认值: FALSE row_locking: 说明: 指定在表已更新或正在更新时是否获取行锁。如果设置为 ALWAYS, 只有在表被更新后才获取...

    WinRAR_4.0.exe

    包含两个掩码,并且所有文件既匹配第一个掩码,也匹配第二个掩码, 较小的子集 或者更精确的匹配拥有更高的优先权。例如,如果你用 *.cpp 和 f*.cpp 掩码, f*.cpp 拥有更高的优先权。 RAR 命令行语法 ~~~~~~...

    rar压缩软件.rar

    包含两个掩码,并且所有文件既匹配第一个掩码,也匹配第二个掩码, 较小的子集 或者更精确的匹配拥有更高的优先权。例如,如果你用 *.cpp 和 f*.cpp 掩码, f*.cpp 拥有更高的优先权。 RAR 命令行语法 ~~~~~~...

    中文简体压缩软件RAR 6.0

    包含两个掩码,并且所有文件及匹配第一个掩码,也匹配第二个掩码, 第一个掩码 将拥有更高的优先权,即使它被放到第二个后面。例如,存在*.cpp 和 f*.cpp 掩码 的情况下,f*.cpp 拥有更高的优先权。 RAR ...

    会计理论考试题

    23.如果要把C盘某个文件夹中的一些文件复制到C盘的另外一个文件央中,在选定文件后,若采用拖放操作,可以用___B___目标的方法。 A、直接拖至 B、Ctrl十拖至 C、Alt十拖至 D、单击 24.Windows98中的磁盘的根文件夹是...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     EXP_FULL_DATABASE, IMP_FULL_DATABASE这两个角色用于数据导入导出工具的使用。  自定义角色 Oracle建议我们自定义自己的角色,使我们更加灵活方便去管理用户  创建角色 SQL&gt; create role admin;  授权给...

    WINRAR5.0正式注册版

    如果两个文件有相同 BLAKE2 值,基本上就可以认定文件内容是相同的。BLAKE2 的错误检测性能比较短的 CRC32 更强。 8. 删除的功能: a) 身份验证功能的可靠性达不到所需的级别,功能被移除; b) RAR 5.0 ...

    史上超高压缩软件2009

    0.240 UDA的第二个正式版,比上一个正式版(0.230)有以下提高:(1)在功能不减并加入解压时 可自定解压缩路径和使用示例的前提下,把自身体积减小到16K!(2)大力度优化了内核, 速度比0.230版提高了10%左右.(3)改善了内存...

    华为编程开发规范与案例

    对某交换类进行计费测试,字冠011对应1号路由、1号子路由,有4个中继群11,12,13,14(都属于1#模块),前后两个群分别构成自环。其中11,13群向为出中继,12,14群向为入中继,对这四个群分别进行计费设置,对出入中继都...

    C#编程经验技巧宝典

    98 &lt;br&gt;0153 如何自定义数字小数点左边分组位数 98 &lt;br&gt;0154 格式化输入数据为货币格式 99 &lt;br&gt;0155 如何计算两个整数的乘积 99 &lt;br&gt;0156 如何将二进制数转换为十进制数 100 &lt;br&gt;0157 如何...

Global site tag (gtag.js) - Google Analytics