1、刪數
有一個數組a[N]順序存放0~N-1,要求每隔兩個數刪掉一個數,到末尾時循環至開頭繼續進行,求最後一個被刪掉的數的原始下標位置。以8個數(N=7)爲例:{0,1,2,3,4,5,6,7},0->1->2(刪除)->3->4->5(刪除)->6->7->0(刪除),如此循環直到最後一個數被刪除。
輸入描述:
每組數據爲一行一個整數n(小於等於1000),爲數組成員數,如果大於1000,則對a[999]進行計算。
輸出描述:
一行輸出最後一個被刪掉的數的原始下標位置。
輸入例子:
8
輸出例子:
6
思路一:
這是我比較直接的想法。定義一個長度爲n的列表,列表值爲0/1,表示元素是否被刪除。
考慮題目描述,每隔兩個數刪除一個數,即遍歷列表,每經過兩個未被刪除的數(值爲0),刪除第三個值爲0的數。定義兩個指針count_total和count_0輔助計算。count_total用來遍歷數組,count_0記錄值爲0,即未被刪除的數,第3*n個即爲結果。
代碼:
import sys
def last_delete_num(l,n):
count_0 = 0
count_total = 0
while count_0 < 3*n:
if l[count_total%n] == 0:
count_0 += 1
if count_0 % 3 == 0:
l[count_total%n] = 1
count_total += 1
return count_total%n-1
while 1:
line = sys.stdin.readline().strip()
if not line:
break
n = min(int(line), 1000)
l = [0] * n
print last_delete_num(l,n)
思路二:
這是一個約瑟夫環問題,遞推公式爲:f[1] = 0 ,f[n] = (f[n - 1] + K) mod n,k = 3
原始:[0,1,2,3,4,5,6,7],刪除的第一個數,即f(n)一定是(k-1)%n
刪除第一個元素k-1後:[0,1, ,3,4,5,6,7] -> [5,6, ,0,1,2,3,4](令k=0, k+1=1...) -> [0,1,2,3,4,5,6](旋轉)
刪除第二個元素後:[0,1, ,4,5,6,7] -> [4,5, ,0,1,2,3] -> [0,1,2,3,4,5]
在新的列表中,刪除的第二個數是 (k-1)%(n-1),(這裏的2是原列表中的5,只要找到2和5的關係就可以了)
新環f(n-1)是由舊環f(n)中的元素減k模n得到的 即f(n) = (f(n-1)+k)%n
依次類推:[0,1,2,3,4] .....[0,1] -> [0]
代碼:
import sys
def last_delete_num(n):
ans = 0
for i in range(2,n+1):
ans = (ans+3) % i
return ans
while 1:
line = sys.stdin.readline().strip()
if not line:
break
n = min(int(line), 1000)
#l = [i for i in range(n)
print last_delete_num(n)
2、字符集合
輸入一個字符串,求出該字符串包含的字符集合
輸入描述:
每組數據輸入一個字符串,字符串最大長度爲100,且只包含字母,不可能爲空串,區分大小寫。
輸出描述:
每組數據一行,按字符串原有的字符順序,輸出字符集合,即重複出現並靠後的字母不輸出。
輸入例子1: abcqweracb
輸出例子1: abcqwer
看起來有點簡單了,沒看懂這題要考什麼
import sys
while 1:
s = sys.stdin.readline().strip()
if s == '':
break
l = []
for i in s:
if i not in l:
l.append(i)
print ''.join(l)
3、數獨
數獨是一個我們都非常熟悉的經典遊戲,運用計算機我們可以很快地解開數獨難題,現在有一些簡單的數獨題目,請編寫一個程序求解。
輸入描述:
輸入9行,每行爲空格隔開的9個數字,爲0的地方就是需要填充的。
輸出描述:
輸出九行,每行九個空格隔開的數字,爲解出的答案。
# -*- coding:utf-8 -*-
import sys
def is_sudoku(ll, add_value, add_x, add_y): #添加Sudoku(i,j)後,是否仍滿足數獨條件
for i in range(9):
if add_value == ll[add_x][i]: #行
return False
if add_value == ll[i][add_y]: #列
return False
for i in range(add_x/3*3,add_x/3*4): #宮
for j in range(add_y/3*3,add_y/3*4):
if add_value == ll[i][j]:
return False
return True
def sudoku(ll, add_list):
if len(add_list) == 0:
return True
else:
add_x, add_y = add_list[0][0], add_list[0][1]
for i in range(1, 10):
if is_sudoku(ll, i, add_x, add_y):
ll[add_x][add_y] = i
flag = sudoku(ll, add_list[1:])
if flag:
return True
ll[add_x][add_y] = 0
return False
while (True):
ll = [] #數獨
add_list = [] #記錄需要填充的位置
for i in range(9):
l = map(int, raw_input().split())
ll.append(l)
for j in range(9):
if ll[i][j] == 0:
add_list.append([i,j])
sudoku(ll,add_list)
for l in ll:
print ' '.join(map(str, l))
來源:牛客網
語言:python2.7