數學和其他
#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 ...