从0开始学算法——第四天(题目参考答案)

写在开头的话

以下是我对于这四道题目的解答(python版),其中代码部分有一部分借助了AI(我说思路AI写的代码哈,因为这样子还不用手打注释),肯定不是最优解,有更好的方法欢迎大家留言,我们共同进步!

第一题解答------字符串

python 复制代码
import sys

def count_different_strings():
    """
    统计不同字符串的数量
    
    主要思想:
    1. 使用Python的内置集合(set)数据结构来存储不同的字符串
    2. 集合会自动去重,相同字符串只会保留一个
    3. 遍历所有输入字符串,将它们添加到集合中
    4. 集合的大小就是不同字符串的数量
    """
    # 读取所有输入数据
    data = sys.stdin.read().split()
    
    # 第一个元素是字符串数量N
    n = int(data[0])
    
    # 从第二个元素开始是N个字符串
    strings = data[1:n+1]
    
    # 使用集合来去重
    # 集合(set)是Python中的一种数据结构,它只存储不重复的元素
    # 当我们向集合中添加元素时,如果元素已经存在,集合不会重复添加
    unique_strings = set()
    
    # 遍历所有字符串并添加到集合中
    for s in strings:
        unique_strings.add(s)
        # 集合会自动处理重复的字符串
    
    # 输出不同字符串的数量,即集合的大小
    print(len(unique_strings))

if __name__ == "__main__":
    count_different_strings()

第二题解答------括号串

python 复制代码
def is_valid_parentheses(n, s):
    # 如果长度是奇数,不可能是合法的括号序列(空串除外)
    if n % 2 != 0:
        return "No"
    
    stack = []
    for ch in s:
        if ch == '(':
            stack.append(ch)
        elif ch == ')':
            if not stack:  # 栈为空,无法匹配
                return "No"
            stack.pop()  # 匹配一个左括号
        else:
            # 题目保证只包含括号,所以这里不会执行,但为了完整性可以加上
            return "No"
    
    # 遍历结束后,栈为空则说明全部匹配
    return "Yes" if not stack else "No"

if __name__ == "__main__":
    n = int(input())
    s = input().strip()
    print(is_valid_parentheses(n, s))

第三题解答------情景

python 复制代码
import sys

def main():
    data = sys.stdin.read().strip().split()
    if not data:
        return
    n = int(data[0])
    a = list(map(int, data[1:1 + n]))
    stack = []
    for x in a:
        if x != 0:
            stack.append(x)
        else:
            if stack:
                stack.pop()
    # 逆序输出栈中元素
    for i in range(len(stack) - 1, -1, -1):
        sys.stdout.write(str(stack[i]) + '\n')

if __name__ == "__main__":
    main()

第四题解答------哈希

python 复制代码
def main():
    import sys
    input = sys.stdin.read
    data = input().split()
    
    q = int(data[0])
    s = set()
    idx = 1
    results = []
    
    for _ in range(q):
        op = data[idx]
        x = int(data[idx + 1])
        idx += 2
        
        if op == 'I':
            s.add(x)
        elif op == 'Q':
            if x in s:
                results.append("Yes")
            else:
                results.append("No")
    
    sys.stdout.write("\n".join(results))

if __name__ == "__main__":
    main()
相关推荐
草履虫建模3 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq5 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq5 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
ASKED_20196 小时前
Langchain学习笔记一 -基础模块以及架构概览
笔记·学习·langchain
爱吃rabbit的mq6 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
Lois_Luo6 小时前
Obsidian + Picgo + Aliyun OSS 实现笔记图片自动上传图床
笔记·oss·图床
好家伙VCC6 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
(❁´◡`❁)Jimmy(❁´◡`❁)7 小时前
Exgcd 学习笔记
笔记·学习·算法
傻小胖7 小时前
21.ETH-权益证明-北大肖臻老师客堂笔记
笔记·区块链
YYuCChi7 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划