defDucci(a):
n = len(a)
first = a[0]
for i in range(n):
a[i] = a[i] - (a[i+1] if i!=n-1else first)
a[i] = abs(a[i])
defvalue(a):
value = 0;base = 1for digit in a:
value = value*10 +digit
base *= 10return value
deftest(array):
Cache = set()
n = len(array)
for i in range(1000):
Ducci(array)
val = value(array)
if val == 0:print('ZERO');breakif val in Cache:print('LOOP');break
Cache.add(val)
defprocess_input():
T = int(input())
while T:
T -= 1
N = int(input())
data = input()
data = data.split(' ')
line = [int(i) for i in data if i.isdigit()]
test(line)
process_input()
习题3:此题简单,直接利用deque模块进行模拟就ok:
from collections import deque
defThrowing(q):
discard = q.popleft()
if len(q)>=2:
card = q.popleft()
q.append(card)
return discard
defprocess():
n = int(input())
while n:
q = deque([i for i in range(1,n+1)])
print('Discarding cards: ',end = '')
while(len(q)!=1):
discard = Throwing(q)
print(discard,end = ' ')
print('\nRemaining Card :',q[0])
n = int(input())
process()
deftest(record):for each in record:
if record[each] != 0:
returnFalsereturnTruedefprocess_input():while1:
n = int(input())
if n == 0:break
record = {}
while n:
line = input()
line = line.split(' ')
pair = (int(line[0]),int(line[1]))
if pair in record:
record[pair] += 1elif (pair[1],pair[0]) in record:
record[(pair[1],pair[0])] -= 1else:
record[pair] = 1
n -= 1if test(record):print('Yes')
else:print('NO')
process_input()
deftest(record_dict,word):
length = len(word)
for i in range(length-1):#(0,i),(i+1,length-1)
w1 = word[0:i+1]
w2 = word[i+1:length]
if w1 in record_dict and w2 in record_dict:
returnTruereturnFalsedefprocess_input():
word = input()
record = set()
while word!='':
record.add(word)
word = input()
for each in record:
if test(record,each):
print(each)
process_input()
from collections import namedtuple
defaverage(each):return sum(each)/len(each)
defcompute(line):
line.sort()
i = 0;j = len(line)-1
mid_col = Nonewhile i <= j:
temp = average([line[i],line[j]])#计算两个端点的中线if mid_col:
if mid_col != temp:returnNone;
mid_col = temp
i += 1;j -= 1return mid_col
deftest(record):
mid_col = Nonefor each in record:
line = record[each]
length = len(line)
temp = compute(line)
ifnot temp:returnFalse#中间的线不存if mid_col:
if mid_col != temp:#不相等returnFalse
mid_col = temp
returnTruedefprocess_input():
T = int(input())
while T:
record = {}
n = int(input())
while n:
p = input()
p = p.split(' ')
y,x = int(p[1]),int(p[0])
if y in record:record[y].append(x)
else:record[y] = [x]
n -= 1
print('YES'if test(record) else'NO')
T -= 1
process_input()
from collections import namedtuple,deque
task = namedtuple('task',['priority','isyou'])
defcompute(q,priority_order):
time = 0defmove(q):
max_priority= priority_order[-1]
x = q.popleft()
if x.priority < max_priority:
q.append(x)
returnNone#没有打印
priority_order.pop()#删除一个最大优先级return x#返回打印的东西while1:
x = move(q)
if x :
time += 1if x.isyou:
return time
defprocess_input():
T = int(input())
while T:
line1 = input()
line2 = input()
line1,line2 = line1.split(' '),line2.split(' ')
n = int(line1[0]);position = int(line1[1])
priority_order = []
q = deque([])
i = 0for each in line2:
t = task(int(each),Trueif i == position elseFalse )
q.append(t)
priority_order.append(t.priority)
i += 1
priority_order.sort()
print(compute(q,priority_order))
T -= 1
process_input()
defget_index(var):
left = var.index('[')+1
right = len(var) - var[::-1].index(']')-1return var[left:right]
defget_arrname(var):
left = 0
right = var.index('[')
return var[left:right]
defprocess_input():deffind_bug(initial_line=None):defvalidate(name,index):
print(arr_cache)
if index!=Noneand index >=0and index < arr_cache[name][0]and index in arr_cache[name][1]:#index合法且不越界,且a[index]存在returnTruereturnNonedefget_value(var):#返回变量的值if'['notin var:return int(var)#常量必然合法#下面可能要递归的考虑问题
name = get_arrname(var)
index_expr = (get_index(var))#获取index的表达形式:a[a[b[3]]]=>a[b[3]]
index = get_value(index_expr)#获取真正的值if validate(name,index):#index合法且不越界,且arr[index]已经初始化return arr_cache[name][1][index]
returnNone
line_index = 1
arr_cache = {}
flag = Falsewhile1:
if initial_line:line = initial_line;initial_line = Noneelse:line = input()
#下面才是开始查找bug的代码if'='in line:#赋值语句
print('check the assign equation')
line = line.split('=')
name = get_arrname(line[0])
index = get_value(get_index(line[0]))
value = get_value(line[1])
print(name,index,value)
ifnot((index>=0and index!=Noneand index <arr_cache[name][0]) and value != None):#两边的变量是不合法的(越界和未初始化)
print(line_index,'error');flag = Trueelse:
arr_cache[name][1][index] = value
else:#数组定义
name = get_arrname(line)
size_expr = (get_index(line))#获取size的表达式
size = get_value(size_expr)
ifnot size>=0:#如果size不合法(negative,or None)
print(line_index,'error');flag = Trueelse:arr_cache[name] = (size,{});#保存初始化的情况,size表示大小,{}用来存储哪些初始化了
line_index += 1ifnot flag:print(0,'no error')
while1:
x = input()
if x=='.':breakelse:find_bug(x)
process_input()
defprocess_input():defquery(cmd):defsimple_find(keyword):
ans = set()
for each in articles:
article = articles[each]
for line_index,line in enumerate(article):
if keyword in line or str.capitalize(keyword) in line:
ans.add(each)
breakreturn ans
ans = [];keys = []
if'AND'in cmd:
cmd = cmd.split(' AND ')
key1,key2 = cmd[0],cmd[1]
keys.append(key1);keys.append(key2)
ans.append(simple_find(key1))
ans.append(simple_find(key2))
final_ans = ans[0] & ans[1]
elif'OR'in cmd:
cmd = cmd.split(' OR ')
key1,key2 = cmd[0],cmd[1]
keys.append(key1);keys.append(key2)
ans.append(simple_find(key1))
ans.append(simple_find(key2))
final_ans = ans[0] | ans[1]
elif'NOT'in cmd:
key1 = cmd.split(' ')[1]
keys.append(key1)
ans.append(simple_find(key1))
final_ans = set([each for each in articles if each notin ans[0]])
else:#只查询关键字
key1 = cmd
keys.append(key1)
final_ans = simple_find(key1)
if len(final_ans)==0:print('Sorry, I found nothing')
else:query_lines(keys,final_ans,last_line,whole = Trueif'NOT'in cmd elseFalse)
defquery_lines(keys,indexs,whole=False):deftest(line):for key in keys:
if key in line or str.capitalize(key) in line :returnTruereturnFalse
indexs = list(indexs)
indexs.sort()
max_index = indexs[-1]
kase = 0for each in indexs:
article = articles[each]
for i,line in enumerate(article):
if test(line) or whole:print(line)
if each != max_index:
print('-'*10)
kase += 1#############################################################
n = int(input())
articles = {}
indexs = {}
kase = 0while n:
articles[kase] = []
article = articles[kase]
while1:
line = input()
if line == '*'*10:break
article.append(line)
kase += 1
n -= 1
n = int(input())
while n:
command = input()
query(command)
print('='*10)#输出分界线
n -= 1
process_input()
5.11:
思路很简单,注意输出细节。
deffind_changes(olddic,newdic):defprint_format(array,symbol):if array==[]:return
array.append(-1)
print(symbol,end='')
i = 0while1:
print(array[i],end='')
if array[i+1]==-1:break
print(',',end='')
i+=1
print('')
#compare the element of olddic with new
adds = [];deletes = [];changes = []
for (key,val) in olddic.items():
if key in newdic:
if val != newdic[key]:
changes.append(key)
else:
deletes.append(key)
for (key,val) in newdic.items():
if key notin olddic:
adds.append(key)
if adds==[] and deletes==[] and changes==[]:print('No Changes');return
print_format(adds,'+')
print_format(deletes,'-')
print_format(changes,'*')
find_changes({'x':1,'xyz':123456789123456789123456789},{'xyz':123456789123456789123456789,'x':1})
find_changes({'first':1,'second':2,'third':3},
{'third':3,'second':2})
classTrie:def__init__(self):
self.data = {'id':None}
defquery(self,str):
now = self.data
for ch in str:
if ch notin now: return -1
now = now[ch]
return now['id']
definsert(self,str,id):
now = self.data
for ch in str:
#标记路径,没有被访问过就要标记ifnot now['id'] :now['id'] = id;
if ch notin now:
now[ch] = {'id':None}#id 代表着对应的值,同时也可以标记是否访问过
now = now[ch]
ifnot now['id']:
now['id'] = id
t = Trie()
t.insert('1',1)
fib = [1,1]
record = {}
for i in range(2,50001):
fib[0],fib[1] =fib[1],fib[0]+fib[1]
s = str(fib[1])[0:40]
t.insert(s,i)
这个题目不难,关键是理解题意,注意到是每一个单词的左边界的都要对齐而且要尽量往左靠,一开始我看成每一行了,结果写了半天觉得不对劲。有一个细节要注意,在使用split()进行分割时,会将空字符串也放进去,我们需要进行判断,如果遇到空字符就跳过。另外就是对每一列的最长单词进行统计,这样我们才能够对齐单词。def format_print(): line = input() words =