522. 106 彰雲嘉區複賽 - Q2 跑長編碼與資料壓縮
ttps://zerojudge.tw/ShowProblem?problemid=e522
解題思路-Python-給我自己的筆記
1。輸入n(有n筆)
我用ans=[ ]放答案用
2。for迴圈a跑n次
ans.append([ ]) 用二維陣列放答案
s=input 一筆一筆放資料
我先判斷如果輸入的不是二進位,直接給-1,跳出這回合的for (continue)
(判斷方式,出現1的次數+出現0的次數不等於s總長度)
ss=[ ] 我用一個空list放各組連續結果
for迴圈i跑s字串次,一個一個字元抓出來看
如果是一樣的字元,確定長度小於7時,放同一個ss[[放這裡]]
長度=7時,創一個新的[ ]放。ss[[滿7],[放新的這裡]]
否則(不一樣字元時),創一個新的[ ]放。ss[[相同],[不同的放這]]
處理ss,把它整整成壓縮後的格式
for迴圈x跑ss次,每次抓出一組相同的值
計算有幾個字元,轉二進位之後整理成所要的格式
xx[0].zfill(1)+(bin(tim)[2:]).zfill(3)
第一個值放0或1的字元,
之後三個放二進位之後的結果,zfill補0三位數。 bin轉二進位
算壓縮率後放到ans中
3。印出ans
----------------------
程式碼參考
n=int(input()) #輸入有n筆
ans=[] #放所有答案用
for a in range(n): #n筆跑n次
ans.append([]) #ans用二維裝
s=input() #一筆一筆輸入資料
if s.count('1')+s.count('0') !=
len(s): #若輸入非二進位時(1和0的次數長度不符)
ans[a].append(-1)
continue #跳出本次,到下一次
ss=[] #放各組連續的結果
ind=0 #從[0]開始放
ss.append([])
t=s[0] #抓第一個出來看
for i in s: #看輸入的單組字串有多長就跑幾次
if i
== t: #把相同的放一組,有可能28個1
if len(ss[ind])<7:
ss[ind].append(i)
else:
ss.append([])
ind=ind+1
ss[ind].append(i)
else:
ss.append([])
ind=ind+1
ss[ind].append(i)
t=str(int(t)^1)
#處理ss整理成壓縮後的格式
timx=0
for x in ss:
ans[a].append([])
xx=''.join(x)
tim=len(xx)
ans[a][timx]=(xx[0].zfill(1)+(bin(tim)[2:]).zfill(3))
timx=timx+1
#算壓縮率
xxx=''.join(ans[a])
ans[a].append(str(round(len(xxx)/len(s)*100)) +'%')
for i in ans:
print(*i)