一组连气儿的数中少了某一个,找到它
添加时间:2013-6-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 <cstdlib>
#include <iostream>
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<<l;
system(PAUSE);
return EXIT_SUCCESS;
}
int FindLose(int a[],int len,int start){
int sum=0;
for(int i=0;i<len;i++){
sum +=((i+start)-a[i]);
}
return sum+(start+len);
}
在一组连气儿的数字中(如从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 <cstdlib>
#include <iostream>
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<<l;
system(PAUSE);
return EXIT_SUCCESS;
}
int FindLose(int a[],int len,int start){
int sum=0;
for(int i=0;i<len;i++){
sum +=((i+start)-a[i]);
}
return sum+(start+len);
}