po主原本是通過c++進行刷題的,對于C++而言還是很方便輸入和輸出的
最近刷題都在用python,主要是因為python編寫起來比較方便,加上想盡快刷掉leetcode上的必刷題,所以一時間不知道應(yīng)該如何用python進行IO流的輸入和輸出
————————————————
版權(quán)聲明:本文為CSDN博主「文山湖的貓」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/single_dog/article/details/125702956
1.1 獲取輸入數(shù)據(jù)
Python輸入數(shù)據(jù)主要通過input()函數(shù)實現(xiàn),input()會讀取控制臺一行的輸入,如果輸入有多行的話,需要多次使用input()。
# 輸入為: 1 2 3 4 5 a = input() # a = '1 2 3 4 5'
Python3中的input()會將接受的數(shù)據(jù)返回為一個string類型,如果一行中有多個數(shù)據(jù)的話,則需要使用split()進行切割。split()切割后返回一個列表。
#輸入為:1 2 3 4 5 a = input().split() # a = ['1', '2', '3', '4', '5'] #輸入為:1,2,3,4,5 b = input().split(',') #b = ['1', '2', '3', '4', '5']
因為input()返回的是string,分割后也是一個字符列表,如果輸入數(shù)據(jù)是數(shù)字則需要進行類型轉(zhuǎn)換。可以單個轉(zhuǎn)換或是用列表批量轉(zhuǎn)換,或者是使用map()并行轉(zhuǎn)換。map()函數(shù)返回的是一個迭代器,不能改變值,如果需要改變值的話還需要轉(zhuǎn)換成列表
#輸入為: 1 a = int(input()) #單個轉(zhuǎn)換 #輸入為:1 2 3 4 5 b = input().split() c = [int(i) for i in b] #也可以為 d = [int(i) for i in input().split()] #使用map進行并行轉(zhuǎn)換 #多行輸入轉(zhuǎn)換 e = map(int, input().split()) f = list(e) #簡寫: g = list(map(int, input().split()))
1.2 三種情況的輸入數(shù)據(jù)
while True: try: data = input() solve(data) except: break
情況2: 多行輸入, 指定用例個數(shù)
n = int(input()) for _ in range(n): data = input() solve(data) #核心函數(shù)
情況3: 多行輸入,指定某個條件退出
while True: data = input() if judge(data): break solve(data)
2. 輸出函數(shù)模板
Python3的輸出主要靠print()函數(shù),就是把結(jié)果打印至終端。需要對print()函數(shù)的sep和end兩個參數(shù)有一定的了解,可以查看菜鳥教程
情況1: 輸出單個數(shù)字
# 輸出 a (a = 1) print(a)
情況2: 輸出多個數(shù)字,同時要求以分隔符隔開
# 輸出 a=1, b=2, c=3 print(a, b, c) # print默認(rèn)以空格為分隔符 # output:1 2 3 print(a, b, c, sep=',') # 以逗號為分隔符 # output:1,2,3
情況3:最終結(jié)果是一個列表
# 最終結(jié)果 res = [1, 2, 3] # 1. 直接輸出列表 print(res) # 2. 輸出列表, 每個元素單獨輸出 for i in range(len(res)): print(res[i]) #output: 1 # 2 # 3 # 3. 輸出列表,每個元素單獨輸出,同時還需要在同一行輸出, 以空格分隔 for i in range(len(res)): print(res[i], end=' ') # end的默認(rèn)值是'\n',即換行 # output: 1 2 3
情況4: 將字符列表合成一個字符串,需要用到join()函數(shù)
# res = ['a', 'b', 'c'] # 輸出是一個字符串 print("".join(res)) # output: abc # 輸出是一個字符串,且用 * 號分隔 print("*".join(res)) # output: a*b*c # 如果用 print(res[i], end = '*') 的話,輸出就是 a*b*c*了,在末尾還多了一個*
3. 鏈表的輸入輸出
acm模式中的鏈表也是通過輸入一個數(shù)組來模擬的,所以獲取輸入數(shù)據(jù)和前面沒有什么不同。
主要在于定義鏈表結(jié)構(gòu)、將輸入數(shù)據(jù)轉(zhuǎn)化為鏈表以及輸出鏈表。
#定義鏈表結(jié)構(gòu) class ListNode: def __init__(self, val, next = None): self.val = val self.next = next # 數(shù)組轉(zhuǎn)鏈表 def nums2ListNode(nums): dummy = ListNode(None) root = ListNode(nums[0])
dummy.next = root i = 1 while i < Len(nums): node = ListNode(nums[I]) root.next = node root = root.next i += 1 root.next = None return dummy.next #打印鏈表 nums = [1,2,3,4,5] root = nums2ListNode(nums) while root: print(root.val) root = root .next
4. 二叉樹
4. 二叉樹的輸入輸出
4.1 完全二叉樹格式輸入
acm模式中一般用輸入一行數(shù)字代表一個二叉樹,一般會以完全二叉樹格式輸入。這行數(shù)字的按照層序遍歷的順序排列,且其中空節(jié)點一般會用特定的符號表示,如0或是null
可以直接用數(shù)組表示二叉樹,例如列表Tree, 將Tree[i]的左子樹和右子樹分別為Tree[2*i+1]和Tree[2*i+2],不過會比較占用空間。
中序遍歷
def inorder_traversal(nums, index): if index >= Len(nums) or nums[index] == -1: return left, right = 2 *index + 1, 2 * index +2 inorder_traversal(nums, left) print(nums[index], end = ' ') inorder_traversal(nums, right) if __name__ == "__main__": nums = input().split() nums = [int(num) if num != 'null' else -1 for num in nums] inorder_traversal(nums, 0)
class TreeNode: def __init__(self, val = 0, left = None, right = None): self.val = val self.left = left self.right = right #由數(shù)組轉(zhuǎn)二叉樹 def construct_binary_tree(nums, index): if index >= Len(nums): return if nums[index] == -1" return None left = index*2-1 right = index*2+1 root = TreeNode(nums[index]) root.left = construct_binary_tree(nums, left) root.right = construct_binary_tree(nums, right) return root #中序遍歷 def inorder_traversal(root): if not root: return inorder_traversal(root.left) print(root.val, end=' ') inorder_traversal(root.right) if __name__ == "__main__": nums = input().split() nums = [int(num) if num != 'null' else -1 for num in nums] root = construct_binary_tree(nums, 0) inorder_traversal(root)
4.2 其他格式輸入
有部分題目的輸入格式不是完全二叉樹,例如leetcode的二叉樹格式,輸入的數(shù)組雖然也是按照層序遍歷的順序,但并不是每一層的空節(jié)點都會表示出來,而是僅表示與非空節(jié)點連接的空節(jié)點。
def construct_binary_tree(nums): if nums == [] : return root = TreeNode(nums[0]) queue = collections.deque() queue.append() I = 1 while I < Len(nums): node = queue.popleft() if I < Len(nums) and nums[I] != -1: node.left = TreeNode(nums[I]) queue.append(node.left) I += 1 if I <len(nums) and nums[I] != -1: node.right = TreeNode(nums[I]) queue.append(node.right) I += 1 return root # 中序遍歷 def inorder_traversal(root): if not root: return inorder_traversal(root.left) print(root.val, end=' ') inorder_traversal(root.right) # 輸入 1 null 1 null 1 2 # 1 # / \ #null 1 # / \ # null 1 # / # 2 if __name__ == "__main__": nums = input().split() nums = [int(num) if num != 'null' else -1 for num in nums] root = construct_binary_tree(nums) inorder_traversal(root) # 輸出 1 1 2 1
Python ACM模式
- 告訴了有多少組數(shù)據(jù)
- 多組輸入數(shù)據(jù),但沒指定多少組
- 輸入一個整數(shù)告訴有多少組數(shù)據(jù),再輸入每組數(shù)據(jù)的具體值
- 多組數(shù)據(jù),并告訴遇到怎么樣的數(shù)據(jù)時結(jié)束(例如0 0)
- 多組數(shù)據(jù),每組數(shù)據(jù)第一個代表這一組數(shù)據(jù)有幾個,最后遇到0結(jié)束
版權(quán)聲明:本文為CSDN博主「小成星際」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_40844276/article/details/120596128
告訴了有多少組數(shù)據(jù)
import sys # 這里寫解決問題的代碼,和LeetCode就完全一樣了 def solve(arr): sum = 0 for i in range(len(arr)): sum += arr[i] return sum if __name__ == '__main__': # 接收輸入的邏輯,這里先把輸入接收過來, 兩種選擇input()和sys.stdin.readline() group_nums = int(input().strip()) # 對于每一組 for i in range(group_nums): # 接收每一組的輸入, 這里不同的題目就不一樣了,但一定記住我們接收的還是一行,這是一個字符串 arr = sys.stdin.readline().strip().split(' ') # 元素轉(zhuǎn)成int arr = list(map(int, arr)) # 輸入接收過來之后,這里最好打印下看看接收的是不是正確,這個很重要 # print(arr) # 處理具體的問題了 res = solve(arr) # 輸出結(jié)果 print(res)
多組輸入數(shù)據(jù),但沒指定多少組
import sys # 這里寫解決問題的代碼,和LeetCode就完全一樣了 def solve(arr): pass if __name__ == '__main__': while True: try: a, b = map(int, input().strip().split()) print(a + b) except EOFError: break # 輸入接收過來之后,這里最好打印下看看接收的是不是正確,這個很重要 # print(arr) # 處理具體的問題了 #res = solve(arr) # 輸出結(jié)果 #print(res)
輸入一個整數(shù)告訴有多少組數(shù)據(jù),再輸入每組數(shù)據(jù)的具體值
import sys # 這里寫解決問題的代碼,和LeetCode就完全一樣了 def solve(arr): pass if __name__ == '__main__': tcase = int(input().strip()) for case in range(tcase): a, b = map(int, input().strip().split()) print(a + b) # 輸入接收過來之后,這里最好打印下看看接收的是不是正確,這個很重要 # print(arr) # 處理具體的問題了 #res = solve(arr) # 輸出結(jié)果 #print(res)
多組數(shù)據(jù),并告訴遇到怎么樣的數(shù)據(jù)時結(jié)束(例如0 0)
import sys # 這里寫解決問題的代碼,和LeetCode就完全一樣了 def solve(arr): pass if __name__ == '__main__': while True: a, b = map(int, input().strip().split()) if a == 0 and b == 0: break print(a + b) # 輸入接收過來之后,這里最好打印下看看接收的是不是正確,這個很重要 # print(arr) # 處理具體的問題了 #res = solve(arr) # 輸出結(jié)果 #print(res)
多組數(shù)據(jù),每組數(shù)據(jù)第一個代表這一組數(shù)據(jù)有幾個,最后遇到0結(jié)束
import sys # 這里寫解決問題的代碼,和LeetCode就完全一樣了 def solve(arr): pass if __name__ == '__main__': while True: data = list(map(int, input().strip().split())) n, array = data[0], data[1:] if n == 0: break print(sum(array)) # 輸入接收過來之后,這里最好打印下看看接收的是不是正確,這個很重要 # print(arr) # 處理具體的問題了 #res = solve(arr) # 輸出結(jié)果 #print(res)
浙公網(wǎng)安備 33010602011771號