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)
浙公网安备 33010602011771号