Q: 在一个1到100的未排序数组中找到缺失的数,你怎么做?
说明:数组中的数字为1到100。 数组中只有一个数字缺失。数组未排序。找到缺少的数字。
A: 你必须表现得像是在想很多。然后讨论n=n(n+1)/2的线性级数之和
function missingNumber(arr){ var n = arr.length+1, sum = 0, expectedSum = n * (n+1)/2; for(var i = 0, len = arr.length; i < len; i++){ sum += arr[i]; } return expectedSum - sum; } missingNumber([5, 2, 6, 1, 3]); // = 4
注意: 这个会返回任意长度数组中缺失的那个
两数之和
Q: 在一个未排序的数组中找出是否有任意两数之和等于给定的数?
A: 简单!双重循环。
function sumFinder(arr, sum){ var len = arr.length; for(var i =0; i<len-1; i++){ for(var j = i+1;j<len; j++){ if (arr[i] + arr[j] == sum) return true; } } return false; } sumFinder([6,4,3,2,1,7], 9); // = true sumFinder([6,4,3,2,1,7], 2); // = false
Q: 时间复杂度?
A: O(n2)。
Q: 有更优解?
A: 我想想。我可以用一个对象来存储当前元素和和值的差值。当我拿到一个新元素,如果这个元素的差值在对象中存在,那么我就能判断出是否存在。
function sumFinder(arr, sum){ var differ = {}, len = arr.length, substract; for(var i =0; i<len; i++){ substract = sum - arr[i]; if(differ[substract]) return true; else differ[arr[i]] = true; } return false; } sumFinder([6,4,3,2,1,7], 9); // = true sumFinder([6,4,3,2,1,7], 2); // = false
最大和
Q: 找到任意两个元素的最大总和?
A: 这实际上非常简单直接。 找到两个最大的数字并返回它们的总和
function topSum(arr){ var biggest = arr[0], second = arr[1], len = arr.length, i = 2; if (len<2) return null; if (biggest<second){ biggest = arr[1]; second = arr[0]; } for(; i<len; i++){ if(arr[i] > biggest){ second = biggest; biggest = arr[i]; } else if (arr[i]>second){ second = arr[i]; } } return biggest + second; }
统计零
Q: 统计从1到n的零总数?
A: 如果 n = 100,则0的数目将是11(0,10,20,30,40,50,60,70,80,90,100)。 请注意,100有两个0.这个看起来很简单,但有点棘手
说明:所以这里的重点是。 如果你有一个1到50的数字,那么这个数值就是5,就是50除以10.然而,如果这个数值是100,这个数值是11,你将得到100/10 = 10和 10/10 = 1。 那就是你将如何在一个数字中得到更多的零,如(100,200,1000);