題目:給定陣列a,大小為n,陣列元素為0到n-1的數字,不過有的數字出現了多次,有的數字沒有出現。請給出演算法和程式,統計哪些數字沒有出現,哪些數字出現了多少次。要求在o(n)的時間複雜度,o(1)的空間複雜度下完成。
解法一:
直接用兩層遍歷,o(n^2)的時間複雜度,o(1)的空間複雜度
#include #include int main()
}
if (count == 0)
else
}
}
}
解法二:
以空間換時間的辦法,用乙個map陣列來存放元素的計數。時間複雜度為o(n),空間複雜度為o(n)
#include #include #include int main()
for (i = 0; i < n; i++)
}
}
但上述解法都不滿足題目對時間複雜度和空間複雜度的要求,因此我們想到重複利用陣列a。
解法三:
三次遍歷陣列的方法:
第一次遍歷:對於每乙個a[i] = a[i] * n
第二次遍歷:對於每乙個i, a[a[i]/n]++
第三次遍歷:對於每乙個i,a[i]%n就是i出現的次數
解釋:a[i]應該出現在a中的a[i]位置,乘以n、再除以n,很容易來回變換;第二次遍歷,對於a[i]本來所在的位置不斷增1,但絕不超出n,那麼每乙個i出現的次數,就是a[i]對n取餘。
#include #include int main()
}
}
解法四:
兩次遍歷陣列的方法:考慮a[i],現在的位置為i,如果採用a來計數,它的位置應該是a[i]%n,找到計數字置,處理這個計數字置的辦法就是加n.
第一次遍歷:對a[i]的計算位置加n,加n可以保證a[i]%n的是不變的
第二次遍歷:a陣列,最後每乙個元素表示為a[i] = x + k * n; 其中x#include int main()
}
}
經典面試題 統計陣列
題目 給定陣列a,大小為n,陣列元素為1到n的數字,不過有的數字出現了多次,有的數字沒有出現。請給出演算法和程式,統計哪些數字沒有出現,哪些數字出現了多少次。能夠在o n 的時間複雜度,o 1 的空間複雜度要求下完成麼?分析 我們知道原陣列是沒有排序的。如果排序了,很簡單的。o 1 的空間含義,可以...
經典面試題 統計陣列
題目 給定陣列a,大小為n,陣列元素為1到n的數字,不過有的數字出現了多次,有的數字沒有出現。請給出演算法和程式,統計哪些數字沒有出現,哪些數字出現了多少次。能夠在o n 的時間複雜度,o 1 的空間複雜度要求下完成麼?分析 我們知道原陣列是沒有排序的。如果排序了,很簡單的。o 1 的空間含義,可以...
常見面試題之陣列
參考文獻 1.程式設計之美 2.劍指offer 3.王道程式設計師求職寶典 常見題如下 1.二維陣列中查詢某個數,該陣列滿足 左 右 遞增,上 下 遞增。利用二分查詢的思想 2.求旋轉陣列中的最小數字。3.利用迴圈優化斐波那契數列。4.調整陣列順序,使奇數字於偶數之前。5.求陣列中出現出現次數超過一...