題目描述:
請幫小明找到該紅包金額。寫出具體演算法思路和**實現,要求演算法盡可能高效。
解題思路
這道題看上去感覺挺簡單,最簡單的方法就是分別算出每個紅包金額出現次數,再找出出現次數過半的金額。但是這麼常規做法肯定
超出了題目所給的限制條件(時間複雜度和空間複雜度),儘管題目沒有明確表明。
首先仔細看題目給出的資訊,紅包金額出現次數超過「一半」,為什麼是一半而不是1/3,1/4?因此解題方法肯定是與這個一半有聯絡。
而我們只需要求出該紅包金額是多少就可以了,不需要求出該紅包出現的次數,所以我們求解的時候次數可以加以利用並改變。
最後再想想,演算法盡可能高校,那麼時間複雜度能不能去到o(n)而空間複雜度限制在o(1)呢?意思就是只在原陣列遍歷一次而不申請其他陣列。
分析到這裡,其實就差不多了。
具體的解題方法就是,遍歷原陣列,只要是兩個不同的金額,就直接抵消掉,最後剩哪個就是哪個過半。
python實現**
importrandom
defgethalfprice(lst):
money =lst[0]
cnt = 1
for m in lst[1:]:
if money !=m:
cnt -= 1
else
: cnt += 1
if cnt ==0:
money ,cnt = m,1
return money
測試**
gifts = [random.randint(1, 100) for i in range(20) ]for i in range(10):
(gifts)
print(gethalfprice(gifts))
執行結果
[70, 26, 43, 1, 100, 67, 76, 75, 70, 71, 67, 67, 14, 98, 81, 25, 56, 72, 100, 53, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70]
70
騰訊2016校招技術崗面試經歷
關於筆試 只要前期複習到位,筆試還是很好過的,但是當然 分數 越高越好,否則後面會被面試官鄙視的。題目可能難度較大,但是要把會做的 都做 對,如果時間比較緊可以適度屏棄部分不會的題目。關於面試 9.14 晚上6點半 一面 30min 提前乙個小時到了酒店,簽到完就坐那裡等,雖然還沒來得及吃晚飯,但是...
騰訊2016校招筆試題(含答案)
1 父母生了兩個小孩。第乙個是男孩,兩個都是男孩的概率是多少?答案 1 2 解釋 第乙個已經為男孩,第二個只有兩種可能男孩或女孩 概率 1乘二分之一 2 設k1,k2是方陣a的兩個不同的特徵值,a與b是屬於k1,k2的特徵向量,則有a與b是 a 線性相關 b 線性無關 c 對應分量成比例 d 可能有...
關於fork函式的執行問題(源於騰訊校招筆試題目)
1 include include include int main return 0 輸出結果為 8個 2 include include include int main return 0 輸出結果為 6個 很納悶,為什麼乙個 n換行符會對輸出結果產生影響呢?究其原因就得考究fork函式是如何產...