【发布时间】:2015-11-08 20:08:17
【问题描述】:
所以我没有通过编程面试题,就像
"给定一个整数数组 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); } }还是我对问题的解释有误? -
char takenSpots [] = n*malloc(sizeof(char));是几个编译器错误。 -
@Kninnug:从问题中可能不清楚,但想法是整数不一定按顺序排列。
-
好吧,你绝对应该从初始化
takenSpots数组中的所有条目开始! -
为什么会更快?平均 n/2 次比较,n 次最坏情况。如果你假设你有 1 到 n 一个缺失,你可以在 O (log n) 中进行二分查找。现在 that 更快了。
标签: c algorithm optimization integer time-complexity