四则运算+从单向链表中删除指定值的节点+名字的漂亮度+数独(Sudoku)
四则运算
含义:给定表达式字符串,输出这个表达式的结果。
例如,表达式 3 + 2 ∗ 1 + 2 ∗ [ − 4 / ( 8 − 6 ) + 7 ] 3+2*{1+2*[-4/(8-6)+7]} 3+2∗1+2∗[−4/(8−6)+7],输出结果为 25 25 25。
要计算一个表达式字符串,需要两个分别存储数字和运算符的容器/数据结构,以及一个处理规则:
1、选择栈作为容器/数据结构,因为它有先进后出的特性;
2、由于数字有 123 123 123 或 − 12 -12 −12 这种形式,因此在计算前提前将数字字符以一个整体存储/展示;
3、乘除的优先级大于加减,因此遇到加减运算符且前面有乘除的子表达式时,先将前面的表达式计算并将其结果作为加减表达式的左侧数字;
4、大中小括号( { } \{\} {}、 [ ] [] [] 和 ( ) () ()),当遇到括号的右半边就执行括号里面的表达式,直到遇到括号的左半边。
def standards(ss):# 处理 -123 和 123 这种数字的情况res, num = [], ''for i, c in enumerate(ss):if c.isdigit():num += celse:if num:res.append(num)num = ''if c == '-': # 可能是负数if i == 0 or ss[i-1] in '({[+-*/':num += ccontinue # 再到上面添加到 resres.append(c)if num:res.append(num)return resdef cal(ss):lst = standards(ss)stackOp, stackN = [], []for i in lst:if i not in '+-/*(){}[]': # 数字stackN.append(i) elif i in '*/([{':stackOp.append(i)elif i in '+-':# */ 的优先级大于 +-,需要提前运算if len(stackOp) == 0 or stackOp[-1] in '([{':stackOp.append(i)else:while stackOp:if stackOp[-1] in '({[':breakop = stackOp.pop()n2, n1 = stackN.pop(), stackN.pop()stackN.append(str(eval(n1 + op + n2)))stackOp.append(i)elif i in ']})':while stackOp[-1] not in '({[':op = stackOp.pop()n2, n1 = stackN.pop(), stackN.pop()stackN.append(str(int(eval(n1 + op + n2))))stackOp.pop()while stackOp:op = stackOp.pop()n2, n1 = stackN.pop(), stackN.pop()stackN.append(str(int(eval(n1 + op + n2))))print(stackN.pop())expr = input()
cal(expr)
从单向链表中删除指定值的节点
class Node:def __init__(self, val=None, next=None) -> None:self.val = valself.next = nextdef construct(head, n, binaryList, deleteVal):for i in range(n-1):insertVal, insertedVal = binaryList[2 * i: 2 * i + 2]head = insert(head, insertedVal, insertVal)head = remove(head, deleteVal)printNodeList(head)return headdef insert(head, val1, val2):cur = headnode = Node(val2)while cur:if cur.val == val1:node.next = cur.nextcur.next = nodebreakcur = cur.nextreturn headdef remove(head, delVal):# 删除特定的值cur, pre = head, Nonewhile cur:if cur.val == delVal:if not pre:head = cur.nextelse:pre.next = cur.nextbreakelse:pre = curcur = cur.nextreturn headdef printNodeList(head):cur, res = head, ""while cur:res += str(cur.val) + " "cur = cur.nextprint(res)# n h (a, b)_{n-1} k
line = list(map(int, input().split(" ")))
n, h, k, binaryList = line[0], line[1], line[-1], line[2:-1]
head = construct(Node(val=h), n, binaryList, k)
名字的漂亮度
from collections import Counterdef fn(s):ss, scores = 26, 0counts = Counter(s)for _, cnt in counts.most_common(): # val, cntscores += ss * cntss -= 1print(scores)# 字符串中,字符最多的分数最高,依次往下,字母的分数不同
n = int(input())
for _ in range(n):fn(input())
数独(Sudoku)
def check(board, x, y):# 检查填入的值是否与同一的行和列的值有重复,不要重复检查for i in range(9):if i != x and board[i][y] == board[x][y]:return False # 检查同一行for j in range(9):if j != y and board[x][j] == board[x][y]:return False # 检查同一列# 检查小的方框内,所填的数字有没有重复m, n = 3 * (x // 3), 3 * (y // 3)for i in range(3):for j in range(3):if (i + m != x or j + n != y) and board[i + m][j + n] == board[x][y]:return Falsereturn True def dfs(board):for i in range(9):for j in range(9):if board[i][j] == 0:for k in '123456789': # 尝试填这几个数字board[i][j] = int(k)if check(board, i, j) and dfs(board):return Trueboard[i][j] = 0 # 不可行,当前选择的数字不合理return False # 不可行,上次选择的数字不合理return Trueboard = []
while True:try:board.append(list(map(int, input().split(' '))))except:break
dfs(board)
for i in board:print(' '.join(list(map(str, i))))