把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為1。
note:給出的所有元素都大於0,若陣列大小為0,請返回0
我的解法
遇到這種有很多特殊情況的,我真的嗝屁。。。
其他分析
這道題真的看了很久很久。當然乙個個遍歷比較大小也能找出最大值但是這樣做複雜度高也沒利用旋轉陣列的特點。
非遞減序列經過旋轉,陣列就分為前後兩個非遞減序列而且前面的序列任何一項都大於等於後面序列的任何一項,最小元素就是兩者的分界點。有序序列的查詢用二分法:
如果是乙個嚴格遞增序列,沒有重複元素,**非常好寫。我只貼出來了部分重要**用來說明思路。
let high = rotatearray.length-
1//旋轉陣列末尾
let low =
0//旋轉陣列頭
while
(high - low >1)
else
if(rotatearray[mid]
)
但是本題中可能會有重複元素(非嚴格遞增),要考慮的情況就會比較複雜了。
有重複元素就要考慮三種情況了,前提low >= high
情況一:rotatearray[mid] == rotatearray[low] > rotatearray[high]
low和mid之間只能是5,mid和high之間不一定,anyway指標low = mid
情況二:rotatearray[mid] == rotatearray[high]< rotatearray[low]
high和mid之間只能是3,mid和low之間不一定,anyway指標high = mid
情況三:rotatearray[mid] == rotatearray[high] == rotatearray[low]
這裡就沒法判斷了,看下面兩張圖,只能乙個個遍歷low和high直接的元素找到最小值
**如下,值得注意的是,low和mid和high三者相等的情況一定寫在最前面,因為三個判斷條件之間是有包含關係的
function
minnumberinrotatearray
(rotatearray)
//旋轉陣列是陣列本身,那麼旋轉陣列是乙個遞增陣列,第乙個元素是最小的
if(rotatearray[low]
)while
(high - low >1)
return result
}else
if(rotatearray[mid]
>=rotatearray[low]
)else
if(rotatearray[mid]
<=rotatearray[high])}
return rotatearray[high]
}
求出1-13的整數中1出現的次數,並算出100-1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。
我的解法
我哪有解法?
其他分析
個位
個位數上的1是每隔10出現1次,比如1,11,21。也就是說0~9出現乙個個位1,10~19出現乙個個位1,20~29出現乙個個位1,以此類推。
首先就可以確定,n/10的整數商是多少就有多少個個位1,比如27/10=2餘7。那麼餘數呢?7>1說明還有乙個個位1,如果餘數是0,那麼就沒有個位1了。
可以得到
k = n%100
count = (n/10)*1 +1(k>=1) or 0(k<1)
十位
十位數上的1是每隔100出現10次,比如100到199有110~119,200到299有210~219,以此類推。
類似的可以先確定n/100的整數商是多少就有多少個十位1,比如217/100=2餘17。接著處理餘數,餘數小於10的話,就沒有十位1了,大於19就還有10個十位1,在這二者之間呢?比如17,有17-10+1=8個十位1。
可以得到
k = n%100
count = (n/10)*1 +10(k>19) or 0(k<10) or k-10+1
百位
有了以上兩個例子。我們可以知道n/1000的整數商個百位1,另外餘數小於100就沒有百位1,餘數大於199就還有100個百位1,在這二者之間就是餘數-100+1
其他位就是類似啦~
function
numberof1between1andn_solution
(n)else
if(k
else
count +=
(math.
floor
(n/(i*10)
))*i+j
}return count
}
不過以上對餘數的判斷冗餘,題解提出了更好的計算j的方法,把三個判斷統一為:
math.
min(math.
max(k - i +1,
0), i)
我也沒看懂咋回 劍指 offer 刷題記錄
任誰都躲不過找工作的問題,好希望能多準備一些時間,奈何時間不等人,每天刷幾道題,並且記錄下來吧 def replacespace s write code here num space 0 new s for i in range len s if i num space 1 for i in ra...
劍指offer刷題記錄
遞迴法 鍊錶的後續遍歷,並用self.k來記錄倒數節點的位置,找到了就返回找到的節點,否則返回none coding utf 8 class listnode def init self,x self.val x self.next none class solution def init self...
劍指offer刷題記錄 綜合
將乙個字串轉換成乙個整數,要求不能使用字串轉換整數的庫函式。數值為0或者字串不是乙個合法的數值則返回0 輸入描述 輸入乙個字串,包括數字字母符號,可以為空 輸出描述 如果是合法的數值表達則返回該數字,否則返回0 做這個題目做的真的很煩,最麻煩的就是判斷當前是否越界。可儲存的最大的正數末位為7,可儲存...