《劍指Offer》面試題3及LeetCode中相似題目
本篇博文總結了《劍指Offer》面試題3:陣列中重複數字的幾種解法,以及LeetCode中與之相似的題目,旨在舉一反三能夠很好地解決這一類問題。
面試題3: 陣列中重複的數字
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。
解法一: 建立一個長度為n的陣列dup,記錄每個數字出現的次數。時間複雜度為O(n),需要O(n)的額外空間。
def duplicate(self, numbers, duplication) :
# write code here
n = len(numbers)
dup = [0] * n
for i in numbers:
dup[i] += 1
for x in range(n):
if dup[x] > 1:
duplication[0] = x
return True
return False
解法二:
def duplicate(self, numbers, duplication) :
# write code here
i = 0
while i < len(numbers):
if numbers[i] != i:
if numbers[numbers[i]] == numbers[i]:
duplication[0] = numbers[i]
return True
else:
tmp = numbers[numbers[i]]
numbers[numbers[i]] = numbers[i]
numbers[i] = tmp
i += 1
return False
LeetCode 287 (同面試題3中的題目2): 不修改陣列找出重複數字
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
- You must not modify the array (assume the array is read only).
- You must use only constant, O(1) extra space.
- Your runtime complexity should be less than O(n2)
- There is only one duplicate number in the array, but it could be repeated more than once
def findDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
lo = 1
hi = len(nums)-1
while lo < hi:
count = 0
mid = lo + (hi - lo)//2
for i in nums:
if i >= lo and i <= mid:
count += 1
if count > mid - lo + 1:
hi = mid
else:
lo = mid + 1
return lo
LeetCode 442: 找出陣列中所有的重複元素
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements that appear twice in this array.
Could you do it without extra space and in O(n) runtime?
解法一: 與面試題3中的解法二類似,但res中可能儲存了多次重複的元素,因此返回時利用了集合的屬性。
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = []
i = 0
while i < len(nums):
if nums[i] == i + 1:
i += 1
else:
if nums[i] == nums[nums[i]-1]:
res.append(nums[i])
i += 1
else:
tmp = nums[nums[i]-1]
nums[nums[i]-1] = nums[i]
nums[i] = tmp
return list(set(res))
解法二: 當掃描至陣列中的元素i,若i為第一次出現,則將下標(i-1)處的元素變為負,即nums[i-1] = -nums[i-1],所以當掃描至i,而下標(i-1)處的元素為負時,i即為重複元素。
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = []
for i in nums:
i = abs(i)
if nums[i-1] < 0:
res.append(i)
else:
nums[i-1] = -nums[i-1]
return res
LeetCode 448: 找出陣列中沒有出現的元素
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
解答: 同上題中的解法二類似,最後統計大於0的元素的下標。
def findDisappearedNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = []
for i in nums:
index = abs(i)-1
if nums[index] > 0:
nums[index] = -nums[index]
for i in range(len(nums)):
if nums[i] > 0:
res.append(i+1)
return res
相關推薦
《劍指Offer》面試題3及LeetCode中相似題目
本篇博文總結了《劍指Offer》面試題3:陣列中重複數字的幾種解法,以及LeetCode中與之相似的題目,旨在舉一反三能夠很好地解決這一類問題。 面試題3: 陣列中重複的數字 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。陣列中某些數
Java 劍指offer 面試題3:陣列中的重複數字
題目一:找出陣列中的重複數字 在一個長度為n的數組裡所有數字都在0~n-1的範圍內,陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道有幾個數字重複幾次,請找出任意一個重複的數字。例如:輸入長度為7的數字組{2,3,1,0,2,5,3},對應的輸出是2或3 解法一: 對陣列進行排序
leetcode 287. 尋找重複數【Medium】【陣列】 && 劍指Offer 面試題3 題目2:不修改陣列找出重複的數字
這道題leetcode和劍指Offer題目略有不同。leetcode說陣列中的重複數可能不止一個,但是結果要求返回一個就行;劍指Offer上說只有一個重複的數,但是重複的次數不一定。兩個題目的共性就是隻需要返回一個重複的數即可。 leetco
劍指Offer面試題3 二維陣列中的查詢
題目描述:在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 1 2 8 9
劍指Offer.面試題3.陣列中重複的數字
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字
劍指Offer面試題3 二維陣列中的查詢
題目描述:在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 1 2 8 9 2 4 9
劍指offer-面試題3-二維陣列中的查詢
演算法過程: 1.選取陣列中右上角的數字 2.如果該數字小於target,則刪除這個數字所在的行row++ 3.如果該數字大於target,則刪除這個數字所在的列column-- public class Find { public
劍指offer——面試題3二維陣列
本系列的文章是作者在讀何海濤所著的《劍指offer——名企面試官精講經典面試題》時將裡面的一些題用java做實現,以供大家參考學習。 面試題3:在一個二維陣列中,每一行都是從上到下遞增,每一列都是從左到右遞增,設計一個函式實現輸入一個這樣的二維陣
劍指Offer-面試題3 陣列中重複的數字
//劍指Offer第三題 //哈工大周興 //聯絡:qq960020310 #include <iostream> using namespace std; /* //插入排序 bool insertSort(int *a,int len) { if (a==
劍指Offer面試題3:二維陣列中的查詢Java版解法
題目:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 第一種解法是全遍歷,這種方
劍指offer面試題三 :陣列中重複的數字( google 面試)
目錄 參考部落格: 題目一:找出陣列中重複的數字 思路一 思路二 題目二:不修改陣列找出重複的數字 測試: 牛客: 牛客高贊(和思路二類似都是hash對映,網友思路真是腦洞大開,這裡相關溢位問題考慮的只有~(1<<31)>>1,
劍指offer面試題12:矩陣中的路徑(Java實現)
題目:請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 例如 a b c e s f c s a d e e 矩
劍指Offer面試題:9.二進位制中1的個數
一、題目:二進位制中1的個數 題目:請實現一個函式,輸入一個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。 二、可能引起死迴圈的解法 一個基本的思路:先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時
劍指Offer——面試題31:整數中1出現的次數
整數中1出現的次數(從1到n整數中1出現的次數) 題目:求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer
劍指Offer面試題66:矩陣中的路徑 java實現
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0
leetcode 70. 爬樓梯【遞迴】【Easy】&& 劍指Offer面試題10 題目2:青蛙跳臺階問題
題目: 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數。 示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1
leetcode 240. 搜尋二維矩陣 II【陣列】【Medium】&&劍指Offer面試題4:二維陣列中的查詢
題目: 編寫一個高效的演算法來搜尋 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具有以下特性: 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例: 現有矩陣 matrix 如下: [
leetcode 70. 爬樓梯【遞迴】【Easy】&& 劍指Offer面試題10 題目2:青蛙跳臺階問題
題目: 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數。 示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1 階 + 1 階 2.
劍指offer面試題:求二叉樹的映象(遞迴、迴圈解法及測試用例)
題目:給定二叉樹,將其變換為源二叉樹的映象。 二叉樹的定義如下: struct TreeNode { int val; TreeNode* left; TreeNode* right; }; 輸入描述: 二叉樹的映象定義: 源二叉樹
劍指Offer面試題15(Java版):鏈表中倒數第K個結點
head 計數器 easy sta 相同 ret white style 輸出 題目: 輸入一個鏈表。輸出該鏈表中倒數第k哥結點。 為了符合大多數人的習慣,本題從1開始計數。即鏈表的尾結點是倒數第1個結點。 比如一個鏈表有6個結點。從頭結點開始它們的值依次是1。2。