31.求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。
**如下:
class solution:
def numberof1between1andn_solution(self, n):
# write code here
ones, m = 0, 1
while m <= n:
ones += (n // m + 8) // 10 * m + (n // m % 10 == 1) * (n % m + 1)
m *= 10
return ones
32.輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。
方法1:使用python內建的方法
class solution:
def printminnumber(self, numbers):
# write code here
if not numbers: return ""
numbers = list(map(str, numbers))
numbers.sort(cmp=lambda x, y: cmp(x + y, y + x))
return "".join(numbers).lstrip('0') or'0'
方法2:
import itertools
class solution:
def printminnumber(self, numbers):
# write code here
if not numbers:
return ""
#利用迭代工具進行全排列
l = list(itertools.permutations(str(i) for i in numbers))
l=for i in l:
#將字串轉化為整型
num = int(''.join(i))
#快速排序
l.sort()
return l[0]
33.把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。
分析:首先從醜數的定義我們知道,乙個醜數的因子只有2,3,5,那麼醜數p = 2 ^ x * 3 ^ y * 5 ^ z,換句話說乙個醜數一定由另乙個醜數乘以2或者乘以3或者乘以5得到,那麼我們從1開始乘以2,3,5,就得到2,3,5三個醜數,在從這三個醜數出發乘以2,3,5就得到4,6,10,6,9,15,10,15,25九個醜數,我們發現這種方法會得到重複的醜數,而且我們題目要求第n個醜數,這樣的方法得到的醜數也是無序的。那麼我們可以維護三個佇列:
(1)醜數陣列: 1
乘以2的佇列:2
乘以3的佇列:3
乘以5的佇列:5
選擇三個佇列頭最小的數2加入醜數陣列,同時將該最小的數乘以2,3,5放入三個佇列;
(2)醜數陣列:1,2
乘以2的佇列:4
乘以3的佇列:3,6
乘以5的佇列:5,10
選擇三個佇列頭最小的數3加入醜數陣列,同時將該最小的數乘以2,3,5放入三個佇列;
(3)醜數陣列:1,2,3
乘以2的佇列:4,6
乘以3的佇列:6,9
乘以5的佇列:5,10,15
選擇三個佇列頭里最小的數4加入醜數陣列,同時將該最小的數乘以2,3,5放入三個佇列;
(4)醜數陣列:1,2,3,4
乘以2的佇列:6,8
乘以3的佇列:6,9,12
乘以5的佇列:5,10,15,20
選擇三個佇列頭里最小的數5加入醜數陣列,同時將該最小的數乘以2,3,5放入三個佇列;
(5)醜數陣列:1,2,3,4,5
乘以2的佇列:6,8,10,
乘以3的佇列:6,9,12,15
乘以5的佇列:10,15,20,25
選擇三個佇列頭里最小的數6加入醜數陣列,但我們發現,有兩個佇列頭都為6,所以我們彈出兩個佇列頭,同時將12,18,30放入三個佇列;
……………………
class solution:
def getuglynumber_solution(self, index):
if (index <= 0):
return 0
uglylist = [1]
indextwo = 0
indexthree = 0
indexfive = 0
for i in range(index-1):
newugly = min(uglylist[indextwo]*2,uglylist[indexthree]*3,uglylist[indexfive]*5)
if (newugly % 2 == 0):
indextwo += 1
if (newugly % 3 == 0):
indexthree += 1
if (newugly % 5 == 0):
indexfive += 1
return uglylist[-1]
34.在乙個字串(0<=字串長度<=10000,全部由字母組成)中找到第乙個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫).
class solution:
def firstnotrepeatingchar(self, s):
if len(s)<0:
return -1
for i in s:
if s.count(i) == 1:
return s.index(i)
break
return -1
35.在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
方法:利用輔助陣列
class solution:
def inversepairs(self, data):
# write code here
count = 0
copy =
for i in data:
copy.sort()
for i in range(len(copy)):
count += data.index(copy[i])
data.remove(copy[i])
return count%1000000007
牛客網刷題
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 立華奏在學習初中數學的時候遇到了這樣一道大水題 設箱子內有 n 個球,其中給 m 個球打上標記,設一次摸球摸到每乙個球的概率均等,求一次摸球摸到打標記的球的概率 e...
牛客網刷題
時間限制 c c 2秒,其他語言4秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 立華奏是乙個剛剛開始學習 oi 的萌新。最近,實力強大的 qingyu 當選了 iods 9102 的出題人。眾所周知,iods 是一場極其毒瘤的比賽。為了在這次...
牛客網刷題筆記
今天在牛客網刷了一道求最長字串是回文數的長度,剛開始的時候,我用兩個指標,乙個指前邊,乙個指後邊,對比兩個指標指向的值,相等則前邊的指標後移,後邊的指標前移,然後再判斷是否相等,如果不相等,那麼就不是回文數,前邊的指標回到第一次開始的地方,後邊的指標回到第一次開始的地方,前邊的指標再自加後移移位,然...