牛客網刷題6 python

2021-09-25 12:16:19 字數 4197 閱讀 6389

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 是一場極其毒瘤的比賽。為了在這次...

牛客網刷題筆記

今天在牛客網刷了一道求最長字串是回文數的長度,剛開始的時候,我用兩個指標,乙個指前邊,乙個指後邊,對比兩個指標指向的值,相等則前邊的指標後移,後邊的指標前移,然後再判斷是否相等,如果不相等,那麼就不是回文數,前邊的指標回到第一次開始的地方,後邊的指標回到第一次開始的地方,前邊的指標再自加後移移位,然...