2024.6.12刷题记录

目录

一、801. 二进制中1的个数 - AcWing题库

二、802. 区间和 - AcWing题库

三、803. 区间合并 - AcWing题库

四、826. 单链表 - AcWing题库

五、827. 双链表 - AcWing题库


一、801. 二进制中1的个数 - AcWing题库

不会,来自题解(AcWing 801. 基础_位运算_二进制中1的个数java_python_c++ - AcWing)。

def func(x):
    # 获取最低位1,并删掉
    return x - (x & -x)
    
if __name__ == '__main__':
    n = int(input())
    nums = list(map(int, input().split()))
    for i in range(n):
        cnt = 0
        x = nums[i]
        while x:
            x = func(x)
            cnt += 1
        print(cnt, end = ' ')

二、802. 区间和 - AcWing题库

不会,思路来自(AcWing 802. 画个图辅助理解~ - AcWing),代码参考(AcWing 802. 区间和 - AcWing),做了修改。

n, m = map(int, input().split())
addNum = [list(map(int, input().split())) for _ in range(n)]
querys = [list(map(int, input().split())) for _ in range(m)]
# 下标映射列表
idxList = [x for x, _ in addNum] + [x for i in querys for x in i]

# 离散化操作
idxList = list(set(idxList))  # 去重
idxList.sort()  # 要排序

# 构造下标映射查找
def find(x):
    # 二分查找
    l, r = 0, len(idxList) - 1
    while l <= r:
        mid = (l + r) // 2
        if idxList[mid] >= x:
            r = mid - 1
        else:
            l = mid + 1
    return l + 1    # 在此处+1,直接映射到1 ~ len(idxList) + 1

# print(idxList)
# 差分数组,下标从1开始
nums = [0] * (len(idxList) + 5)
for x, c in addNum:
    nums[find(x)] += c
# print(nums)
# 求前缀和
# 从1开始,方便后面查询
s = [0] * (len(idxList) + 5)
for i in range(1, len(idxList) + 1):
    s[i] = s[i - 1] + nums[i]
# print(s)
# 查询操作
for i in querys:
    l, r = find(i[0]), find(i[1])
    print(s[r] - s[l - 1])

三、803. 区间合并 - AcWing题库

def main():
    n = int(input())
    lst = [list(map(int, input().split())) for _ in range(n)]
    ans = 1     # 至少为一个
    
    lst.sort(key = lambda x: x[0])  # 将相同开头的放一起
    start, end = lst[0][0], lst[0][1]
    for s, e in lst:
        if s > end:
            # 下一个区间不相接时更新
            ans += 1
            start = s
        end = max(end, e)
    
    print(ans)
    
main()

四、826. 单链表 - AcWing题库

不会,思路来自题解(AcWing 826. 单链表---图解 - AcWing),代码来自题解(AcWing 826. 单链表 - AcWing)。

# 用列表实现链表
N = 100010
e = [0] * N     # 表示节点值
ne = [0] * N    # next指针

def init():
    # 初始化
    global head, idx
    head = -1
    idx = 0
    
def add_to_head(x):
    # 插入节点到head后
    global head, idx
    e[idx] = x  # 构造节点
    ne[idx] = head  # 更改指针
    head = idx
    idx += 1
    
def add(k, x):
    # 将节点添加在节点k后
    global idx
    e[idx] = x
    ne[idx] = ne[k]
    ne[k] = idx
    idx += 1

def remove(k):
    # 移除节点k后的节点
    ne[k] = ne[ne[k]]
    
m = int(input())

init()  # 记得初始化链表

for _ in range(m):
    oper = list(input().split())
    if oper[0] == 'H':
        x = int(oper[1])
        add_to_head(x)
    elif oper[0] == 'D':
        k = int(oper[1])
        if k == 0:
            head = ne[head]     # 去掉第一个节点
        else:
            remove(k - 1)   # 第k个插入的节点的下标为k - 1
    else:
        k, x = int(oper[1]), int(oper[2])
        add(k - 1, x)
        
# 输出
cur = head
while cur != -1:
    print(e[cur], end = ' ')
    cur = ne[cur]   # 下一节点

五、827. 双链表 - AcWing题库

参考题解(AcWing 827. 双链表 - AcWing)。

# 双链表将头尾算作节点

def init(n = 100010):
    # 初始化,n为长度
    global e, pe, ne, idx
    e = [0] * (m + 2)
    pe = [0] * (m + 2)    # 前节点
    ne = [0] * (m + 2)    # 后节点
    ne[0] = 1
    pe[1] = 0
    idx = 2     #0头1尾

def remove(k):
    global e, pe, ne, idx
    # 将第k个节点删除
    pe[ne[k]] = pe[k]
    ne[pe[k]] = ne[k]
 
def insert(k, x):
    global e, pe, ne, idx
    # 在第 k 个插入的数右侧插入一个数
    e[idx] = x
    pe[idx] = k
    ne[idx] = ne[k]
    # 更改连接
    ne[pe[idx]] = idx
    pe[ne[idx]] = idx
    idx += 1
    
m = int(input())

init(m)     # 以命令长度初始化,链表长度不会超过

# 注意下标和节点的映射关系,第k个节点的下标是k + 1
for _ in range(m):
    oper = input().split()
    if oper[0] == 'L':
        insert(0, int(oper[1]))
    elif oper[0] == 'R':
        # 尾节点的上一个节点的右侧插入
        insert(pe[1], int(oper[1]))
    elif oper[0] == 'D':
        # 下标映射
        remove(int(oper[1]) + 1)
    elif oper[0] == 'IL':
        # 第k个节点的左节点的右侧插入
        insert(pe[int(oper[1]) + 1], int(oper[2]))
    else:
        # 第k个节点的右侧插入
        insert(int(oper[1]) + 1, int(oper[2]))

# 输出
cur = ne[0] # 头节点的右节点是第一个节点
res = []
while cur != 1:
    res.append(str(e[cur]))
    cur = ne[cur]
print(' '.join(res))

感谢你看到这里!一起加油吧! 

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值