fgg blog

: 刷题

刷题之走火入魔解法

问题描述:给定一个包含 n + 1 个整数的数组,数字范围在 1 到 n 之间,其中有一个重复的数。 找出这个重复的数。

解法1: 平平无奇的思考结果,我想大部分人都会想到这个解法。

相似题目,参考:力扣 645. 错误的集合

def findDuplicate2(nums):
    nums_sum = sum(nums)
    sets_sum = sum(set(nums))
    return nums_sum - sets_sum

解法2: 这个解法如果没有个十年脑血栓,恐怕很难会想到把数组元素当成索引来变成链表耍,然后 还能想到环状链表的环起点是重复的那个元素。

相似题目,参考:力扣 LCR 022. 环形链表 II (单链表找环的入口节点)

def findDuplicate(nums):
    # 初始化慢指针和快指针
    slow = nums[0]
    fast = nums[0]

    # 快慢指针移动直到相遇
    while True:
        slow = nums[slow]       # 慢指针每次走一步
        fast = nums[nums[fast]] # 快指针每次走两步
        if slow == fast:
            break

    # 重置一个指针到起点,寻找环的入口
    slow = nums[0]
    while slow != fast:
        slow = nums[slow]
        fast = nums[fast]

    # 返回重复的数字
    return slow

构建二叉树

# 刷题和刷题的副作用

我在刷题的时候,很搞笑,是先接触到对二叉树进行各种骚操作。意思是说,牛客或者力扣这些平台 已经默认给你的就是一棵二叉树,你只需要完成诸如前中后序各种遍历二叉树节点的算法。如果你对 这些概念感到陌生,没关系,成年人游戏喜欢吗?

脑筋急转弯


题目描述
A 和 B 两个人要分苹果。A 希望按照他的计算规则得到平均分配的苹果,而 B 希望在满足 A 的条 件下获得尽可能多的苹果量。

A 的计算规则是按照二进制加法进行,并不计算进位。例如,12 + 5 = 9 (1100 + 0101 = 1001)。

B 的计算规则是正常的十进制加法,包括进位。

给定苹果的数量和每个苹果的重量,计算并满足 A 的要求的情况下,B 能获得的最大苹果总重量。 如果无法满足 A 的要求,则输出 -1。

输入描述
第一行包含一个整数 n,表示苹果的数量。

第二行包含 n 个整数,表示每个苹果的重量 w1, w2, …, wn。

输出描述
输出一个整数,表示 B 能获得的最大苹果总重量。如果无法满足 A 的要求,则输出 -1。

示例1
输入:
3
3 5 6

输出:
11

说明:
通过二进制无进位加法,A 要求的总重量是 3 XOR 5 XOR 6 = 0,B 能获得所有的苹果,总重量为 11。

外行人禁止入内

  1. 讲给自己人听

给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。

Q:这个题目到底在表达什么意思?太抽象,完全看不懂。
A:
社区靓仔1: 滑动窗口,简单题
社区靓仔2: 固定窗口
社区靓仔3: …(与)
社区靓仔4: …(主)
社区靓仔5: …(题)
社区靓仔.: …(相)
社区靓仔.: …(关)
社区靓仔.: …(度)
社区靓仔.: …(降)
社区靓仔.: …(到)
社区靓仔.: …(零)