经典逻辑编程题(本文用python实现)
生活随笔
收集整理的這篇文章主要介紹了
经典逻辑编程题(本文用python实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
思路:從左下角元素往上查找,右邊元素是比這個元素大,上邊是的元素比這個元素小。于是,target比這個元素小就往上找,比這個元素大就往右找。如果出了邊界,則說明二維數組中不存在target元素。
array= [[1,2,3],[2,3,4],[3,4,5]] def find_item(item,array):cols = len(array[0]) - 1rows = len(array) - 1i = rows j = 0while j <= cols and i >= 0 :if item > array[i][j]:j += 1elif item < array[i][j]:i -= 1else:return Truereturn False二維列表第一個數字相加生成一個新列表e
k = [[1],[1, 2],[1, 2, 3],[1, 2, 3, 4]] e = [] for i in range(len(k[-1])):num = 0for L in k :if len(L) > i:num +=L[i]e.append(num) print(e)二維列表旋轉90度
a = [[1,2,3],[3,4,5],[2,3,5]] b = [] for i in range(len(a)):c = []for L in a:c.insert(0, L[i]) # 插入到c的第一個元素之前b.append(c) print(b) b=[[2, 3, 1], [3, 4, 2], [5, 5, 3]]請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
思路:轉成列表,循環遍歷下標替換即可,還可以直接用a = replace(' ', '%20')
def replaceSpace(self, s):a = list(s)for i in range(len(a)):if a[i] == ' ':a[i] = '%20' return ''.join(a)在一個先增長后減小的數組中找到最大值
思路:二分法算法的應用,先找到中間值,如果前一個和一個都比這個值小,則這個值就是最大值
A = [1,2,3,4,5] B = [9,4,3,2,1] C = [1,2,3,4,3,2,1] def peek_point(A):start = 0end = len(A)-1while start <= end:mid = (start + end) // 2try: # 一直遞增a=A[mid+1]except:return A[-1]try: # 一直遞減b=[mid-1]except:return A[0]if A[mid-1] < A[mid] > A[mid+1]: # 先遞增后遞減return A[mid]elif A[mid] >= A[mid-1]:start = mid + 1else:end = midprint(peek_point(A)) print(peek_point(B)) print(peek_point(C))一個有正有負的數組中,求出一個連續子數組和是最大的值(注意:任意元素個數組成的連續的子數組)
思路:求出所有子序列,開始下標可以是0~len(arr)-1,結束下標可以是1~len(arr)(此代碼可優化,各位大佬可以幫想一下)
def find_big(arr):zlist=[]for i in range(0, len(arr)):for j in range(i,len(arr)):num = zlist.append(sum(arr[i:j+1]))return max(zlist) print(find_big([1,-2,-3,4,3,-1,2])) # --》8對字符串a=‘abc’進行隨意組合成不同順序的字符串,例如acb,bac…6種組合方式
a='abc' [(i+j+m) for i in a for j in a for m in a if i != j and j !=m and i!=m]對字典列表按年齡進行倒序排序d_list = [{'name':'a','age':18},....]
d_list.sort(key=lambda x:x['age'],reverse = True)如何將一個可迭代對象的每個元素變成一個字典的所有鍵?
{}.fromkeys(['jim','han'],21) # output:{'jim': 21, 'han': 21}一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
思路:斐波那契數列
fib = lambda n: n if n <=2 else fib(n-1) + fib(n-2)一只青蛙一次可以跳上1級臺階,也可跳2級。還可跳n級臺階,求該青蛙跳上一個n級的臺階總共有多少種跳法。
fib = lambda n:n if n < 2 else fib(n-1)*2實現刪除一個 L1=[1,2,3,3,2]里面的重復元素,保證原序
L2 = list(set(L1)) L2.sort(key = L1.index) # 使用列表生成時 append L2 = [] [L2.append(i) for i in L1 if i not in L2]合并兩個有序列表
def loop_merge_sort(l1, l2):tmp = []while len(l1) > 0 and len(l2) > 0:if l1[0] > l2[0]:tmp.append(l2[0])del l2[0] # 列表刪除時間復雜度大else:tmp.append(l1[0])del l1[0]tmp.extend(l1)tmp.extend(l2)return tmp # 不刪除元素,采用歸并a = [1,2,3,4] 、 b = [5,6,7] def merge(a,b):L,R=0,0slist=[]while L < len(a) and R < len(b):if a[L] > b[R]:slist.append(b[R])R +=1else:slist.append(a[L])L +=1slist+=a[L:]slist+=b[R:]return slist輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = Noneclass Solution:# 返回從尾部到頭部的列表值序列,例如[1,2,3]def printListFromTailToHead(self, listNode):l = []head = listNodewhile head:l.insert(0, head.val)head = head.nextreturn l實現一個二叉樹,有add添加節點方法,前中后序遍歷,層次遍歷
class Node(object):def __init__(self,elem=-1, lchild=None, rchild=None):self.elem = elemself.lchild = lchildself.rchild = rchild class Tree(object):def __init__(self,root=None):self.root = rootdef add(self,elem):node = Node(elem)if self.root == Noneself.root = nodeelse:queue = []queue.append(self.root)# 往隊列添加跟節點# 對已有的節點進行層次遍歷while queue:cur = queue.pop(0)if cur.lchild == None:cur.lchild = nodereturnelif cur.rchild == None: cur.rchild = nodereturnelse:#如果左右子樹都不為空,加入隊列繼續判斷queue.append(cur.lchild)queue.append(cur.rchild)def q_order(self, root):'''先序遍歷'''if root == None:returnprint(root.elem)self.q_order(root.lchild)self.q_order(root.rchild)def z_order(self,root):'''中序遍歷print語句放在中間'''def h_order(self,root):'''后續遍歷同理放在后面'''def breadth_travel(self):"""利用隊列實現樹的層次遍歷"""if root == None:returnqueue = []queue.append(root)while queue:node = queue.pop(0)print(node.elem) # 先打印跟節點if node.lchild != None:queue.append(node.lchild)if node.rchild != None:queue.append(node.rchild)文件操作
def ws(id,name):stu = str(id) + ','+name+'\n'with open('d.txt','a+',encoding='utf8') as f:f.seek(0) # 移動坐標到文件開頭contents = f.readlines()flag = Falsefor i, c in enumerate(contents):y_id = c.rstrip().split(',')[0]if id == int(y_id): # 發現第i行重復的id,那就更改這行的內容contents[i] = stuflag = Trueif not flag: # 如果沒找到重復的id,直接追加到文件尾部f.write(stu)if flag: # 如果讀到的內容被更改了,覆蓋源文件,寫入新數據with open('d.txt','w',encoding='utf8') as f2:f2.write(''.join(contents))實現一個鏈表的append和printl方法
class LinkNode(object):'''實現一個節點類'''def __init__(self, x):self.val = xself.next = None class LinkedList(object):'''實現鏈表類'''def __init__(self):self._head = Nonedef is_empty(self):return self._head == Nonedef append(self,x):node = LinkNode(x)if self.is_empty():self._head = nodeelse:cur = self._headwhile cur.next != None: # 找出cur = cur.nextcur.next = nodedef printl(self):'''遍歷打鏈表'''cur = self._headwhile cur != None:print(cur.val,end='')cur = cur.next l = LinkedList() l.append('abc') l.append('xyz') l.printl() # 常用的鏈表方法 class SingleLinkList(object):"""單鏈表"""def __init__(self):self.__head = Nonedef is_empty(self):"""判斷鏈表是否為空"""return self.__head == Nonedef length(self):"""鏈表長度"""# cur初始時指向頭節點cur = self.__headcount = 0# 尾節點指向None,當未到達尾部時while cur != None:count += 1# 將cur后移一個節點cur = cur.nextreturn countdef travel(self):"""遍歷鏈表"""cur = self.__headwhile cur != None:print cur.item,cur = cur.nextprint ""def add(self, item):"""頭部添加元素"""# 先創建一個保存item值的節點node = SingleNode(item)# 將新節點的鏈接域next指向頭節點,即_head指向的位置node.next = self.__head# 將鏈表的頭_head指向新節點self.__head = nodedef append(self, item):"""尾部添加元素"""node = SingleNode(item)# 先判斷鏈表是否為空,若是空鏈表,則將_head指向新節點if self.is_empty():self.__head = node# 若不為空,則找到尾部,將尾節點的next指向新節點else:cur = self.__headwhile cur.next != None:cur = cur.nextcur.next = nodedef insert(self, pos, item):"""指定位置添加元素"""# 若指定位置pos為第一個元素之前,則執行頭部插入if pos <= 0:self.add(item)# 若指定位置超過鏈表尾部,則執行尾部插入elif pos > (self.length()-1):self.append(item)# 找到指定位置else:node = SingleNode(item)count = 0# pre用來指向指定位置pos的前一個位置pos-1,初始從頭節點開始移動到指定位置pre = self.__headwhile count < (pos-1):count += 1pre = pre.next# 先將新節點node的next指向插入位置的節點node.next = pre.next# 將插入位置的前一個節點的next指向新節點pre.next = nodedef remove(self,item):"""刪除節點"""cur = self.__headpre = Nonewhile cur != None:# 找到了指定元素if cur.item == item:# 如果第一個就是刪除的節點if not pre:# 將頭指針指向頭節點的后一個節點self.__head = cur.nextelse:# 將刪除位置前一個節點的next指向刪除位置的后一個節點pre.next = cur.nextbreakelse:# 繼續按鏈表后移節點pre = curcur = cur.nextdef search(self,item):"""鏈表查找節點是否存在,并返回True或者False"""cur = self.__headwhile cur != None:if cur.item == item:return Truecur = cur.nextreturn False判斷一個單鏈表是否有環
思路:快慢兩個游標都從head開始,快游標依次移動2步,慢移動1步,如果有環,總會相遇
def exist_h(linkList):p1 = p2 = linkList # 指針指向頭結點while p2 and p2.next: # 當鏈表為空,或者沒有下一個節點時,表示沒有環p1 = p1.next # 一次移動一步p2 = p2.next.next # 一次移動兩步if p1 == p2: # 如果兩個游標相交,那么說明有環return Truereturn Falseif __name__ == '__main__':l = LinkNode(1) # 頭結點l1 = LinkNode(2)l2 = LinkNode(3)l3 = LinkNode(4)l4 = LinkNode(5)# 組成一條鏈l.next = l1l1.next = l2l2.next = l3l3.next = l4l4.next = l2 # l4結點指向l2結點,有環print(exist_h(l)) # 返回 True總結
以上是生活随笔為你收集整理的经典逻辑编程题(本文用python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 弹窗 onpause,A
- 下一篇: 大数据相关整理