我在编程面试中失败了,问题是:
“给定一个由整数1、2、...、n组成的数组,其中一个数字丢失了,找出这个缺失的数字。”
面试官说正确答案是将这些数字求和,然后用n(n+1)/2减去总和,即应用公式https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF
并且说任何计算机科学专业的学生都应该知道这个方法。而我的解决方案是:
char takenSpots [] = n*malloc(sizeof(char));
for (int k = 0; k < n; ++k) takenSpots[arr[k]-1] = 'x';
for (int k = 0; k < n; ++k) if (takenSpots[k] != 'x') return (k+1);
这并不像我承认我从未尝试过的总和解决方案那么“酷”。
首先,使用总和方法存在溢出的危险,如果arr
包含 ~((int)0)
和 ~((int)0) - 1
怎么办?那么arr[0] + arr[1] + ... + arr[n-1]
会溢出吗?还是说这个解决方案仍然有效,因为1 + 2 + ... + n
也会溢出?
for(i = 1; i < n; i++){ if(arr[i - 1] != arr[i] - 1){ printf("Found it: %i\n", arr[i] - 1); } }
我是否理解问题有误? - Kninnug