在寫完上一篇我經歷的前端面試題(一)兩個月後的今天,我又重新審視自己寫的東西。果然發現了一些錯誤。這篇主要糾正上篇文章中最後第13題的解法中的一些用錯的地方。
題目:算法題:給一個數組,無序。輸出其中沒有的最小正整數,時間複雜度爲O(n)。
原解法:
let testArray=[7,-1,2,4,4,8,7,3,5];
let mapping=new Map();
for(var i=0;i<testArray.length;i++){
if(testArray[i]>0){
mapping[testArray[i]]=true;
}
}
console.log(mapping);
var minValue=Object.keys(mapping)[0];
var maxValue=Object.keys(mapping)[Object.keys(mapping).length-1];
for(var i=minValue;i<maxValue;i++){
if(mapping[i]!=true){
console.log(i);
return;
}
}
- 首先說,這個解法有一處邏輯錯誤:審題錯誤。
在找這個數的時候,由於console.log(mapping)的時候是一個key有序的對象,我用minValue和maxValue分別代表第一個(最小)key和最後一個(最大)key進行遍歷。這樣的解法忽略了最小正整數1不在測試用例裏的情況。
即,如果測試用例如上,會輸出6而不是1,因爲是從2到8遍歷的。
- 其次,這裏的Map用法錯誤。(與Object對比)
Map是ES6的一種數據結構。
它類似於對象(Object {}),也是鍵值對的集合。
Object的鍵(key)只能是字符串。結構提供了“字符串—值”的對應
而Map的key的範圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。Map 結構提供了“值—值”的對應
因此Map是一種更完善的 Hash 結構實現。
Map的用法:
使用set(key,value)添加元素
/*遍歷一個數組爲map 使key>0的值爲true,否則爲false*/
const map = new Map()
let arr = [7,-1,2,4,1,4,8,7,3,5]
arr.forEach((value, index)=> {
value >0 ? map.set(value, true) : map.set(value, false)
})
console.log(map)
使用size屬性返回map成員個數
console.log(map.size) // 10
🌟而在上面的解法中,map的使用不規範,map中沒有成員,map.size爲0
原解法中給map增加元素的方法是Object的方法。
let obj = {}
let testArr = [7,-1,2,4,1,4,8,7,3,5]
testArr.forEach((value)=> {
value >0 ? obj[value] = true : ''
})
console.log(obj) // 注意這裏輸出爲有序
Object中成員個數不能用length來返回(沒有此屬性)-- 爲什麼沒有?涉及原型鏈知識。準備再寫一篇
console.log(obj.length) // undefined
那麼如何獲取Object中成員個數呢?
可以使用ES6中Object的擴展:屬性的可枚舉性和遍歷
用的比較多的:
Object.keys(obj) // 返回對象自身的所有可枚舉的屬性的鍵名的數組
Object.values(obj) // 返回一個給定對象自身的所有可枚舉屬性值的數組
因爲返回的是數組,所以可以通過length屬性獲得對象中成員屬性。
console.log(Object.keys(obj))
console.log(Object.keys(obj).length) // 7
- Map是無序,但是由上面截圖可以看出,obj是有序的,這是爲什麼呢?
🌟根據屬性遍歷的次序規則
由於obj中的key都是數值型,所以是按照升序排列的,因此會得到一個key有序且爲升序的對象。
綜上,我現在改進此題解法。
1.增加多種情況判斷
2.精簡代碼
function minPositiveInt(arr){
let obj = {}
if(arr.length == 0){
return 1
}
if(arr.length == 1){
return arr[0]
}
arr.forEach((value)=> {
value > 0 ? obj[value] = true : ''
})
for(var i = Object.keys(obj)[0]; i< Object.keys(obj)[Object.keys(obj).length-1]; i++){
if(!obj[i]){
return i
}
}
}
let testArr = [7,-1,2,4,1,4,8,7,3,5]
console.log(minPositiveInt(testArr)) // 6