我正在尝试编写一个接受0到9(含)之间的唯一整数数组的函数,并返回缺少的元素。这就是我所拥有的。如此接近但到目前为止。
var currentPlace = 0;
function getMissingElement(superImportantArray){
while (currentPlace < 9){
for (var i = 0; i < 10; i++) {
var arrayNum = superImportantArray[currentPlace]
if (i == arrayNum) {
currentPlace ++;
console.log("so it's not " + i);
}
else if (i !=arrayNum) {
console.log("try..." + i);
}
}
}
}
// run
var myArray = [0,5,1,3,2,9,7,6,4]; // this test should return 8
getMissingElement(myArray);
我不确定我是否正确接近这一点。谢谢你的时间。
答案 0 :(得分:1)
function getMissingElement(superImportantArray){
var result = [], length = Math.max(10, superImportantArray.length);
for (var i = 0; i < length; i++) {
if(superImportantArray.indexOf(i) == -1){
result.push(i);
}
}
return result;
}
试试这个。这将返回一个缺少元素的数组,否则返回一个空数组。 DEMO FIDDLE
答案 1 :(得分:1)
所以这是一种方法:由于您知道数组只包含0
到9
的值,因此您可以构建一组“数字”并删除每个“看到”的值在数组中:
function getMissingElement(superImportantArray){
var numbers = {};
for (var i = 0; i < 10; i++) {
numbers[i] = true
}
for (var i = 0, l = superImportantArray.length; i < l; i++) {
delete numbers[superImportantArray[i]];
}
return Object.keys(numbers);
}
这将返回缺少所有数字的数组。如果总是只有一个缺失的数字,您可以轻松修改它以直接返回该数字。
答案 2 :(得分:1)
这应该这样做。
function getMissingElement(arrayTest) {
// create an array with all digits
var digitsArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var index;
for (var i=0; i<arrayTest.length; i++) {
// get the index of current digit on our array
index = digitsArray.indexOf(arrayTest[i]);
// if found, remove it from our array.
if (index >= 0) {
digitsArray.splice(index,1);
}
}
// the last remaining digit in the original array should be the one missing.
return (digitsArray[0]);
}
答案 3 :(得分:1)
只想在评论中发表我的回答。在我看来,一种更简单的方法是循环遍历原始数组,并在它们所代表的索引处标记一个新数组。例如,如果数字为4,则标记新数组中的第4个索引。所有这一切的原因是因为一旦完成,一个索引应该保持未标记。剩下要做的就是找到未标记的索引。
这是一个例子(我在这里评论了代码,而不是小提琴):
function findMissing(array, min, max) {
var missing, unfilledArray, i, j;
// Array to hold the flags
unfilledArray = [];
for (i = min, j = max; i <= j; i++) {
// Flag the index in the new array with the current value
unfilledArray[array[i]] = true;
}
for (i = min, j = max; i <= j; i++) {
// Loop over new array and find the unflagged index
currentUnfilled = unfilledArray[i];
if (!currentUnfilled) {
// Current index not flagged
missing = i;
break;
}
}
return missing;
}
DEMO: http://jsfiddle.net/6GAyw/
我添加的另一个小功能是你明确指定了最小值和最大值,在你的情况下,它是0和9.这个功能允许这个解决方案用于任何数字范围(不像我原来的评论/建议)。
并不是说我完全理解大O符号,但我相信这是O(2n),而不是O(n ^ 2),因为没有嵌套循环/ indexOf
。
如果您希望获取某个范围内的所有缺失数字,则可以轻松修改该函数以返回未标记索引的数组。这是一个例子:
function findMissing(array, min, max) {
var missing, unfilledArray, i, j;
// Array to hold the missing numbers
missing = [];
// Array to hold the flags
unfilledArray = [];
for (i = min, j = max; i <= j; i++) {
// Flag the index in the new array with the current value
unfilledArray[array[i]] = true;
}
for (i = min, j = max; i <= j; i++) {
// Loop over new array and find the unflagged index
currentUnfilled = unfilledArray[i];
if (!currentUnfilled) {
// Current index not flagged
missing.push(i);
}
}
return missing;
}
答案 4 :(得分:0)
这个对眼睛更好。
function getMissingElement(superImportantArray) {
return superImportantArray.reduce(function (sum, value) {return sum - value;}, 45);
}