每日做題之劍指offer(五)

2021-08-22 18:15:38 字數 4366 閱讀 4532

時間限制:1秒 空間限制:32768k 熱度指數:156582

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

解題思路:

/*

struct treenode

};*/

class solution

return prootoftree;

}void help(treenode* cur,treenode*& pre)

};

時間限制:1秒 空間限制:32768k 熱度指數:241299

本題知識點: 字串

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
解題思路:

# -*- coding:utf-8 -*-

import itertools

class solution:

def permutation(self, ss):

# write code here

if not ss:

return

return sorted(list(set(map(''.join, itertools.permutations(ss)))))

時間限制:1秒 空間限制:32768k 熱度指數:210161

本題知識點: 陣列

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

解題思路:

# -*- coding:utf-8 -*-

class solution:

def morethanhalfnum_solution(self, numbers):

# write code here

if not numbers:

return 0

result = numbers[0]

times = 1

length = len(numbers)

for i in range(1, length-1):

print times

if times == 0:

result = numbers[i+1]

elif result == numbers[i+1]:

times += 1

else:

times -= 1

if numbers.count(result)*2 > length:

return result

return 0

時間限制:1秒 空間限制:32768k 熱度指數:268814

本題知識點: 陣列

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,

解題思路:解法一:(時間複雜度為o(n), 只有當我們可以修改輸入的陣列時可用)

class solution 

input[beg] = key;

return beg;

}vectorgetleastnumbers_solution(vectorinput, int k) ;

int low = 0;

int high = input.size()-1;

int pos = partion(input, low, high);

while (pos != k - 1)

else

}vectorres(input.begin(), input.begin() + k);

return res;}};

解法二;(時間複雜度為o(nlogk)的演算法,特別適合處理海量資料)

class solution 

sort_heap(result.begin(),result.end());

return result;}};

時間限制:1秒 空間限制:32768k 熱度指數:148691

本題知識點: 陣列

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

解題思路:

class solution 

return maxsum;}};

時間限制:1秒 空間限制:32768k 熱度指數:117393

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

解題思路:(一)採取暴力解決,效率比較低下,時間複雜度為o(nlogn)

class solution 

}return count;}};

(二)

# -*- coding:utf-8 -*-

class solution:

def numberof1between1andn_solution(self, n):

# write code here

'''思路:x∈[1,9],0不適用

從 1 至 10,在它們的個位數中,任意的 x 都出現了 1 次。

從 1 至 100,在它們的十位數中,任意的 x 都出現了 10 次。

從 1 至 1000,在它們的百位數中,任意的 x 都出現了 100 次。

依此類推,從 1 至 10^i ,在它們的左數第二位(右數第 i 位)中,任意的 x 都出現了 10^(i−1) 次。

'''x=1

if n<0 or x<=0 or x>9:

return 0

high=-1;low=-1;time=0

i=1#i為數字n從右往左的第i位

while high!=0:

high = n / (10 ** i) # 拿到高位

temp = n % (10 ** i)

occur = temp / (10 ** (i - 1)) # 拿到第i位上的數字

low = n % (10 ** (i - 1))#拿到i的低位

time+=high*(10**(i-1))#先算基礎值,再加上低位的進行補充

if occur>x:#比x大,把第i位的次數加上

time=time+10**(i-1)

elif occur==x:

time=time+low+1

i+=1

return time

每日做題之劍指offer(四)

時間限制 1秒 空間限制 32768k 熱度指數 177188 本題知識點 棧 定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 時間複雜度應為o 1 解題思路 class solution void pop int top int min private stacksta...

出鞘之劍指offer 第14題 剪繩子

給你一根長度為n的繩子,請把繩子剪成m段 m和n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?使用動態規劃。package offer.xzs.fourteenth public class demo01 public sta...

CPP之劍指 Offer 66 構建乘積陣列

給定乙個陣列 a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中 b 中的元素 b i a 0 a 1 a i 1 a i 1 a n 1 不能使用除法。根據題目描述,函式名是constructarr,函式輸入是vector a,返回值應當是新的陣列 vector ret。陣列a中的元素對應...