博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一组连续的数中少了某一个,找到它
阅读量:5883 次
发布时间:2019-06-19

本文共 946 字,大约阅读时间需要 3 分钟。

在一组连续的数字中(如从1到10000)去掉某一个值,将去掉的值放到一个数组中,求出去掉的那个值。

这是一道很经典的题,相信大家都知道怎么做。目前我看的最好的做法有两种:

一、求和相减法:将1到10000这10000个数相加得到数a;然后将数组中的数相加得到数b;最后a-b就是我们要求的值。但是,这种最后存在一个问题,就是可能存在越界的问题,当上界很大的时候很肯尼个造成相加操作越界。所以有了第二种解法。

二、辅助数组法:将从1到10000这1万个数放入到一个数组中,然后将新数组和原数组位位相减,最后得出了值就是我们要求的值。但是,这种解法的空间复杂度是O(n)。

那么有没有一种解法可以是时间复杂度O(n),空间复杂度是O(1),且不越界的算法呢?答案是肯定的。因为,我们可以利用原数组的下标。

分析:

设数组元素从大到小以此为{x1,x2,....,xk-1,xk+1,...,xn},xk即为所缺少的值

y1=x1+x2+...+xk-1+xk+1,...+xn

y2=x1+x2+...+xk-1+xk+xk+1,...+xn

y3=x1+x2+...+xk-1+xk+xk+1,...+xn-1

则xk=y2-y1=y3-y1+xn

其中,y3就是原数组的下标之和,我们可以很容易在不分别计算出y3和y1值的情况下,计算出y3-y1。

而xn其实就是数组的长度。

至此,可得出所求的值xk

算法如下:(这里我们假设更一般的情况,这些连续的数字不是从1开始,而是可以从任意数字开始)

#include 
#include
using namespace std;int FindLose(int *a,int len,int start);int main(int argc, char *argv[]){ int a[] ={
25,29,33,26,28,32,31,30}; int l = FindLose(a,8,25); cout<

 

转载于:https://www.cnblogs.com/joleang/archive/2013/06/03/3115520.html

你可能感兴趣的文章
Mac-OSX下Ruby更新
查看>>
jsp九个内置对象
查看>>
[Python笔记][第一章Python基础]
查看>>
Bloomberg SEP 12.x 迁移小记
查看>>
生日小助手V1.1发布了——拥有更整齐的信息列表
查看>>
代理模式
查看>>
Qt 学习(1)
查看>>
MFC CEdit改变字体大小的方法
查看>>
java 中文数字排序方法
查看>>
centos 关于防火墙的命令
查看>>
openstack 源码分析
查看>>
idea 使用maven plugin tomcat 运行正常,无法进入debug模式
查看>>
Classification Truth Table
查看>>
JVM学习:对象的创建和内存分配
查看>>
C++ 静态变量 全局变量 const
查看>>
vs 高级保存选项的设置
查看>>
Java读取文本指定的某一行内容的方法
查看>>
软件工程敏捷开发04
查看>>
Practise Site Home Sample Page Codes de carte cadeau Amazon | Codes Promo Amazon
查看>>
linux c下输入密码不回显
查看>>