jesse

导航

 
  1 #冒泡排序
  2 for i in range(len(n)):  # 0 6
  3     for ii in range(i+1,len(n)):
  4         if n[i]>n[ii]:
  5             t = n[ii]
  6             n[ii] = n[i]
  7             n[i] = t
  8             
  9 print(n)
 10 
 11 
 12 
 13 
 14 
 15 #插入排序
 16 new_n = []
 17 for i in range(len(n)):
 18     if i == 0 or i == 1:
 19         new_n = [1,100]
 20         continue
 21     for ii in range(len(new_n)-1,0,-1): # 1
 22         if n[i]>new_n[ii-1] and n[i]<new_n[ii]:
 23             new_n.insert(ii,n[i])
 24             break
 25         elif n[i]<new_n[0]:
 26             new_n.insert(0,n[i])
 27             break
 28         elif n[i]>new_n[len(new_n)-1]:
 29             new_n.insert(-1,n[i])
 30             break
 31 print(new_n)
 32 
 33 
 34 
 35 
 36 
 37 #选择排序
 38 new_n = []
 39 while len(n):
 40     new_n.append(min(n))
 41     n.remove(min(n))
 42 print(new_n)
 43 
 44 
 45 
 46 
 47 
 48 
 49 #斐波那契数列     1 1 2 3 5 8 13 21
 50 def fibonaci(n):
 51     if n == 1 or n == 2:
 52         return 1
 53     else:
 54         return fibonaci(n-1)+fibonaci(n-2)
 55 print(fibonaci(7))
 56 
 57 
 58 
 59 
 60 
 61 
 62 #字符串压缩算法,如果压缩后的字符串没有变短,则返回原字符串
 63 s = 'abbccdddddde555'
 64 def yasuo(raw_s):
 65     n = 1
 66     new_s = ''      #abbccc
 67     raw_s_length = len(raw_s)
 68     for i in range(raw_s_length):
 69         if i == raw_s_length - 1:
 70             new_s = new_s + raw_s[i] + str(n)
 71         elif raw_s[i] == raw_s[i+1]:
 72             n += 1
 73         elif raw_s[i] != raw_s[i+1]:
 74             new_s = new_s + raw_s[i] + str(n)
 75             n = 1
 76     if raw_s_length <= len(new_s):
 77         return raw_s
 78     else:
 79         return new_s
 80         
 81 print(yasuo(s))
 82 
 83 
 84 
 85 
 86 
 87 
 88 #两串乱序同构
 89 #思路:先判断两串长度是否相等,不等直接返回False;长度相等,则把s1元素放在列表中,循环s2的所有元素,s2的元素如果在列表中就从列表删去该元素,如果不在列表就返回False
 92 s1 = 'This is nowcoder'
 93 s2 = 'is This nowcoder'
 94 def same(s1, s2):
 95     if len(s1) != len(s2):
 96         return False
 97     else:
 98         li = []
 99         for i in s1:
100             li.append(i)
101         for i in s2:
102             if i not in li:
103                 return False
104             else:
105                 li.remove(i)
106         return True
107         
108 print(same(s1, s2))
109 
110 
111 
112 
113 
114 
115 #像素顺时针旋转90度
116 # 1  2 3 
117 # 4  5 6
118 # 7  8 9
119  
120 #7  4  1
121 #8  5  2
122 #9  6  3
123 li = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
124 def reverse_right_90(raw_li):
125     li = []
126     new_li = []
127     for i in range(len(raw_li)):
128         for ii in raw_li:
129             li.insert(0, ii[i])
130         new_li.append(li)
131         li = []
132     return new_li
133 print(reverse_right_90(li))
134 
135 
136 
137 
138 
139 
140 #清除行列
141 #当某个元素为0时,将其所在的行与列清零
142 # 1 2 3
143 # 0 1 2
144 # 0 0 1
145 
146 # 0 0 3
147 # 0 0 0
148 # 0 0 0
149 #注意:1、在原列表修改,如果改为0后,可能对后面的判断是否为0造成干扰,导致整个列表为0;2、如果复制旧列表,要注意深浅拷贝的问题
151 import copy
152 li = [[1, 2, 3], [0, 1, 2], [0, 0, 1]]
153 def clear(raw_li):
154     new_li = copy.deepcopy(raw_li)
155     for i in range(len(raw_li)):
156         for ii in range(len(raw_li[i])):
157             if raw_li[i][ii] == 0:
158                 for x in range(len(raw_li[i])):
159                     new_li[i][x] = 0
160                 for y in range(len(raw_li)):
161                     new_li[y][ii] = 0
162     return new_li
163 print(clear(li))
164 
165 
166 
167 
168 
169 #翻转子串
170 #给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
172 #思路:先判断s1和s2是否长度相同,相同则创建一个新字符串s = s1 + s1,如果s2是s的子串,那必然是s1的子串
174 def issubset(s1, s2):   #判断s2是否为s1的子集
175     if s2 in s1:
176         return True
177     else:
178         return False
179         
180 s1 = 'Hello world'
181 s2 = 'worldHelo '
182 def reverse_set(s1, s2):
183     if len(s1) != len(s2):
184         return False
185     s = s1 + s1
186     if issubset(s, s2):
187         return True
188     else:
189         return False
190 print(reverse_set(s1,s2))
191 
192 
193 
194 
195 
196 
197 #二进制插入
198 #将m的二进制数替换掉n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始
200 #注意:用bin把10进制数转换成二进制数后变成字符串格式,且该字符串以'0b'开头,用n = bin(n)[2:]来去除'0b'字符串
202 #int(a,b)中的a参数是待转换的数字字符串,b是该数的具体进制
203 def bin_insert(n, m, j, i):
204     n = bin(n)[2:]
205     m = bin(m)[2:]
206     li = list(n)
207     for b in m:
208         li[len(li)-1-i] = b
209         i -= 1
210     return int(''.join(li), 2)
211     
212 print(bin_insert(21, 5, 1, 3))
213 
214 
215 
216 
217 
218 #最接近的数
219 #有一个正整数,请找出其二进制表示中1的个数相同,且大小最接近的那两个数(一个略大,一个略小)
221 def approach(n):
222     bin_n = bin(n)
223     big = int(bin_n, 2) + 1
224     bin_big = bin(big)
225     while bin_big.count('1') != bin_n.count('1'):
226         big += 1
227         bin_big = bin(big)
228     small = int(bin_n, 2) -1
229     bin_small = bin(small)
230     while bin_small.count('1') != bin_n.count('1'):
231         small -= 1
232         bin_small = bin(small)
233     return int(bin_small, 2), int(bin_big, 2)
234 print(approach(5))
235 
236 
237 
238 
239 
240 #整数转化
241 #编写一个函数,确定需要改变几个位,才能将整数a转变成整数b
242 #思路:先把a、b转换为二进制数,然后在位数较少的二进制数上补零,通过循环对比每个位置的数
244 def change(a,b):
245     bin_a = bin(a)[2:]
246     bin_b = bin(b)[2:]
247     if len(bin_a) > len(bin_b):     #如果bin_a的位数比bin_b的位数多,则在b的左边补零到跟a的位数一样多
248         bin_b = bin_b.rjust(len(bin_a), '0')
249     else:
250         bin_a = bin_a.rjust(len(bin_b), '0')
251     n = 0
252     for i in range(len(bin_a)):
253         if bin_a[i] != bin_b[i]:
254             n += 1
255     return n
256 print(change(27,4))
257 
258 
259 
260 
261 
262 
263 #奇偶位交换
264 #交换一个数的二进制的奇数位和偶数位
265 #思路:先判断二进制数长度是奇数还是偶数,奇数则补零,然后通过循环(步长设置为2)进行交换
267 def change(n):
268     bin_n = bin(n)[2:]
269     if len(bin_n) % 2 != 0:
270         bin_n = bin_n.rjust(len(bin_n)+1, '0')
271     li = list(bin_n)
272     for i in range(0, len(li), 2):
273         li[i], li[i+1] = li[i+1], li[i]
274     return int(''.join(li), 2)
275 print(change(42))
276 
277 
278 
279 
280 
281 #在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率。(这里的相撞是指
283 #存在任意两只蚂蚁会相撞)。给定一个int n(3<=n<=10000),代表n边形和n只蚂蚁,请返回一个double,为相撞的概率。
286 #思路:每个蚂蚁爬行的方向都有两个,即围绕多边形顺时针爬和逆时针爬,因此n个蚂蚁爬行的方法有2^n种。只有当所有
288 #的蚂蚁按照同一个方向爬行才能保证所有的蚂蚁都不相撞,只有两种方法--都按逆时针或顺时针方向爬行。
290 def ants(n):
291     return 1 - 2/(2**n)
292 print(ants(3))
293 
294 
295 
296 
297 
298 #上楼梯
299 #n阶楼梯,一次可以上1阶、2阶、3阶。给定一个台阶数,计算有多少种上楼的方式
301 #思路:递归实现
302 def upstairs(n):
303     if n == 1:  return 1
304     elif n == 2:  return 2
305     elif n == 3:  return 4
306     else:
307         return upstairs(n-1) + upstairs(n-2) + upstairs(n-3)
308 print(upstairs(5))
309 
310 
311 
312 
313 
314 
315 #机器人走方格(无障碍)
316 #有一个X*Y网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。给定两正整数,返回机器人的走法数目
318 def path(x,y):
319     if x == 1 or y == 1:
320         return 1
321     else:
322         return path(x-1, y) + path(x, y-1)
323 print(path(2,3))
324 
325 
326 
327 
328 
329 
330 #棋盘覆盖问题
331 #在2^k * 2^k个方格组成的棋盘中,有一个方格被占用,用4种L型骨牌覆盖棋盘上的其余所有方格,不能重叠。
333 #思路:采用递归和分治的方法,先创建二维数组,全部数字置为-1,把棋盘平均分成4份,特殊格子必定在某个
335 #分棋盘中,则把剩余3个小棋盘靠近中间的格子设置为另一个数,然后把刚设置为另一个数的格子当作特殊方格,
337 #把小棋盘继续平均分成四份。
338 def chess(cx, cy, sx, sy, size):    #cx,cy:特殊格子的横纵坐标,sx,sy:小棋盘左上角和右上角坐标
339     if size == 1:
340         return
341     global COUNT,table
342     COUNT += 1
343     l = COUNT
344     half = size // 2
345     if cx<half+sx and cy<half+sy:
346         chess(cx, cy, sx, sy, half)
347     else:
348         table[sy+half-1][sx+half-1] = l
349         chess(sx+half-1, sy+half-1, sx, sy, half)
350     if cx<half+sx and cy>half+sy-1:
351         chess(cx, cy, sx, sy+half, half)
352     else:
353         table[sy+half][sx+half-1] = l
354         chess(sx+half-1, sy+half, sx, sy+half, half)
355     if cx>half+sx-1 and cy<half+sy:
356         chess(cx, cy, sx+half, sy, half)
357     else:
358         table[sy+half-1][sx+half] = l
359         chess(sx+half, sy+half-1, sx+half, sy, half)
360     if cx>half+sx-1 and cy>half+sy-1:
361         chess(cx, cy, sx+half, sy+half, half)
362     else:
363         table[sy+half][sx+half] = l
364         chess(sx+half, sy+half, sx+half, sy+half, half)
365 
366 n = 4
367 COUNT = 0
368 table = [[-1 for i in range(n)] for ii in range(n)]
369 chess(1, 1, 0, 0, n)
370 for i in table:
371     print(i)

 

posted on 2018-03-30 09:31  jessewu  阅读(264)  评论(0)    收藏  举报