给出一系列n-1个不同的正整数,所有这些整数都小于或等于整数'n'。你必须找到范围[1,2,...,n]中缺少的整数。在不使用数组的情况下解决问题。
输入格式: 一行包含整数'n',其中2 <= n <= 10,000 第一行后面是一系列'n-1'个不同的正整数。请注意,序列可能没有任何特定的顺序。
我使用数组
获得了代码#include<stdio.h>
int main()
{
int i,j,n[9999],m,t;
scanf("%d",&m);
for(i=1;i<m;i++)
{
scanf("%d",&n[i]);
}
for(i=1;i<m;i++)
{
for(j=1;j<i;j++)
{
if(n[j]>n[j+1])
{
t=n[j];
n[j]=n[j+1];
n[j+1]=t;
}
}
}
for(i=2;i<m;i++)
{
if(n[i-1]!=n[i]-1)
{
printf("%d",n[i]-1);
break;
}
}
return(0);
}
如何在不使用数组的情况下执行相同的操作?
答案 0 :(得分:7)
逻辑很简单。您只需找到给定n的连续数字的总和。
并且,现在添加问题中提供的所有数字,以找到给定数字的总和。
区别在于你可以说这两个总和之间的差异是缺失的数字。
Ex: - 比方说,n = 6。
因此,您只需找到从1开始的n个连续整数的总和,...,6是: - 6 *(6 + 1)/ 2 = 21.从1开始的n个连续整数之和的公式为{ n *(n + 1)} / 2.
现在,找到给定n-1个数字的总和。
说,给出的数字是1,2,4,5,6。然后他们的总和= 1 + 2 + 4 + 5 + 6 = 18。
因此,缺失的数字=连续n个数的总和 - 给定(n-1)个数的总和= 3.
答案 1 :(得分:5)
求出给定整数的总和。从n(n + 1)/ 2中减去它。
说明:前n个整数的和为n(n + 1)/ 2。因此,给定整数的总和+缺失整数= n(n + 1)/ 2。
假设n = 10;
然后,1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 10 *(10 + 1)/ 2 == 55
如果给定的整数是-1,2,3,4,5,6,7,8,10。
然后回答= 55 - (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 10)= 9.
答案 2 :(得分:3)
为了找到1到n-1数组中缺少的数字,我们有两个方法,一个是和公式,第二个是使用XOR方法,其中两个方法都给出O(n)时间复杂度。
使用Sum Formula
1获取数字之和
total = n*(n+1)/2
2从sum和中减去所有数字 你会得到丢失的号码。
使用XOR方法
对所有数组元素进行XOR运算,让XOR的结果为X1。
2 XOR从1到n的所有数字,让XOR为X2。
X1和X2的3 XOR给出了缺失的数字。
答案 3 :(得分:0)
'你可以使用sum方法作为数组中总数的总和,如总数组大小= 5,元素是1,2,4,5,6然后大小= 5然后使用此方法(n(n + 1) )/ 2 n = 5这里有15个来计算 再次数组1 + 2 + 4 + 5 + 6 = 18的元素之和 因此18-15 = 3 简单的“