劍指offer 數學和其他

2021-10-24 04:31:15 字數 4343 閱讀 9950

數學和其他

#14_2.py

# 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]...k[m - 1] 。請問 k[0]*k[1]*...*k[m - 1] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

class

solution

:def

cuttingrope

(self, n:

int)

->

int:

if n<=3:

return n-

1 div=n//

3 remain=n%

3if remain==0:

return

3**div%

1000000007

if remain==1:

return3**

(div-1)

*4%1000000007

if remain==2:

return2*

3**div%

1000000007

#15.py

# 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。

# 示例 1:

# 輸入:00000000000000000000000000001011

# 輸出:3

# 解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 '1'。

# 示例 2:

# 輸入:00000000000000000000000010000000

# 輸出:1

# 解釋:輸入的二進位制串 00000000000000000000000010000000 中,共有一位為 '1'。

# 示例 3:

# 輸入:11111111111111111111111111111101

# 輸出:31

# 解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 '1'。

class

solution

:def

hammingweight

(self, n:

int)

->

int:

mask=

1 count=

0for i in

range(32

):if n&mask>0:

count+=

1 mask=mask<<

1return count

#42.py

# 輸入乙個整數 n ,求1~n這n個整數的十進位制表示中1出現的次數。

# 例如,輸入12,1~12這些整數中包含1 的數字有1、10、11和12,1一共出現了5次。

# 示例 1:

# 輸入:n = 12

# 輸出:5

# 示例 2:

# 輸入:n = 13

# 輸出:6

class

solution

:def

countdigitone

(self, n:

int)

->

int:

res=

0 digit=

1 high,cur,low=n//

10,n%10,

0while high!=

0or cur!=0:

if cur ==

0: res += high * digit

elif cur ==

1: res += high * digit + low +

1else

: res +=

(high +1)

* digit

low+=cur*digit

cur=high%

10 high=high//

10 digit*=

10return res

#43.py

# 輸入乙個整數 n ,求1~n這n個整數的十進位制表示中1出現的次數。

# 例如,輸入12,1~12這些整數中包含1 的數字有1、10、11和12,1一共出現了5次。

# # 示例 1:

# 輸入:n = 12

# 輸出:5

# 示例 2:

# 輸入:n = 13

# 輸出:6

class

solution

:def

countdigitone

(self, n:

int)

->

int:

res=

0 digit=

1 high,cur,low=n//

10,n%10,

0while high!=

0or cur!=0:

if cur ==

0: res += high * digit

elif cur ==

1: res += high * digit + low +

1else

: res +=

(high +1)

* digit

low+=cur*digit

cur=high%

10 high=high//

10 digit*=

10return res

#44.py

# 數字以0123456789101112131415…的格式序列化到乙個字串行中。在這個序列中,第5位(從下標0開始計數)是5,第13位是1,第19位是4,等等。

# 請寫乙個函式,求任意第n位對應的數字。

# # 示例 1:

# 輸入:n = 3

# 輸出:3

# 示例 2:

# 輸入:n = 11

# 輸出:0

class

solution

:def

findnthdigit

(self, n:

int)

->

int:

#1位數字1-9一共9個(1*9)

#2位數字10-99一共90個 (2*90)

#3位數字100-999一共900個(3*900)

#4位1000-9999,9000個(4*9000)

digit=

1 start=

1 count=

9while n>count:

n=n-count

digit+=

1 start*=

10 count=digit*start*

9return

int(

str(start+

(n-1

)//digit)

[(n-1)

%digit]

)

#45.py

# 數字以0123456789101112131415…的格式序列化到乙個字串行中。在這個序列中,第5位(從下標0開始計數)是5,第13位是1,第19位是4,等等。

# 請寫乙個函式,求任意第n位對應的數字。

# 示例 1:

# 輸入:n = 3

# 輸出:3

# 示例 2:

# 輸入:n = 11

# 輸出:0

class

solution

:def

minnumber

(self, nums: list[

int])-

>

str:

defrules

(a,b)

:if a+b>b+a:

return

1if a+breturn-1

else

:return

0 nums=

[str

(i)for i in nums]

nums.sort(key=functools.cmp_to_key(rules)

)return

"".join(nums)

劍指offer 數學

題目一 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。解題思路 數列滿足遞增,設兩個頭尾兩個指標i和j,若ai aj sum,就是答案 相差越遠乘積越小 若ai aj...

劍指offer數學問題

題目描述 求1 2 3 n,要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 題目分析 這是明顯的等差數列求和問題,可以直接使用等差數列的求和公式算出答案,但是題目要求不能使用乘除法。累加問題可以用遞迴來解決,但是遞迴需要if 條件來跳...

劍指offer 四 棧和佇列及數學相關 cpp

1.用兩個棧實現佇列 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution intpop int res stack2.top stack2.pop return res private stack int stack1 stack int ...