351 LeetCode周赛

一 美丽下标对的数目

  • 模拟 GCD

  • Python

    class Solution:
        def countBeautifulPairs(self, nums: List[int]) -> int:
            n = len(nums)
            ans = 0
    
            for i in range(n):
                first = nums[i]
                while first >= 10:
                    first //= 10
                for j in range(i+1, n):
                    last = nums[j] % 10
                    if gcd(first, last) == 1:
                        ans += 1
            return ans
    
    

def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)


- Golang

```go
func countBeautifulPairs(nums []int) (ans int) {
    n := len(nums)

    for i := 0; i < n; i++ {
        first := nums[i]
        for first >= 10 {
            first /= 10
        }
        for j := i + 1; j < n; j++ {
            last := nums[j] % 10
            if gcd(first, last) == 1{
                ans++
            }
        }
    }
    return ans
}

func gcd(a, b int) int {
    if b == 0 {
        return a
    }
    return gcd(b, a%b)
}

[二 得到整数零需要执行的最少操作数]

  • 枚举

    从1开始枚举k, 设x=num1-num2*k, x为k个 2 **i 之和

    当x < k时,但k个 2 **i 之和最小为k,此时操作不成立。且随着k增大,x减小,之后条件也不会成立。因此,此时返回-1

    当k最小为 bitCount(x),bitCount为x中1的个数,由于2 i 可以由两个2i-1组成。因此k的取值范围为 bitCount(x) <=k < x

  • Python

    class Solution:
        def makeTheIntegerZero(self, num1: int, num2: int) -> int:
            k = 1
            while True:
                x = num1 - k * num2
    
                if x < k:
                    return -1
    
                if k >= x.bit_count():
                    return k
                k += 1
  • Golang

    
    func makeTheIntegerZero(num1 int, num2 int) int &#123;
        k := 1
        for &#123;
            x := num1 - num2*k
    
            if x < k &#123;
                return -1
            &#125;
    
            if k >= bitCount(x) &#123;
                return k
            &#125;
            k++
        &#125;
    &#125;
    
    func bitCount(a int) (c int) &#123;
        for a != 0 &#123;
            if a%2 != 0 &#123;
                c++
            &#125;
            a /= 2
        &#125;
        return
    &#125;

[三 将数组划分成若干好子数组的方式]

  • 数学

  • Python

    class Solution:
        def numberOfGoodSubarraySplits(self, nums: List[int]) -> int:
            if sum(nums) == 0:
                return 0
            ans = 1
            pre = 1
            i = 0
    
            while nums[i] != 1:
                i += 1
    
            while i < len(nums):
                if nums[i] == 1:
                    ans *= pre
                    ans %= (10**9 + 7)
                    pre = 1
                else:
                    pre += 1
                i += 1
            return ans
  • Golang

    func numberOfGoodSubarraySplits(nums []int) int &#123;
        i := 0
        n := len(nums)
    
        for i < n && nums[i] == 0 &#123;
            i++
        &#125;
    
        if i == n &#123;
            return 0
        &#125;
    
        ans := 1
        pre := 1
        for i < n &#123;
            if nums[i] == 1 &#123;
                ans *= pre
                pre = 1
                ans %= 1e9  + 7
            &#125;else&#123;
                pre ++
            &#125;
            i++
        &#125;
        return ans
    &#125;

四 机器人碰撞

  • 排序

  • Python

    class Solution:
        def survivedRobotsHealths(self, positions: List[int], healths: List[int], directions: str) -> List[int]:
            stack = []
            n = len(positions)
            robots = [[positions[i], healths[i], directions[i], i] for i in range(n)]
            robots.sort(key=lambda x: x[0])
    
            for i in range(n):
                if robots[i][2] == "L":
                    while stack and stack[-1][0] == "R" and stack[-1][1] < robots[i][1]:
                        stack.pop()
                        robots[i][1] -= 1
                    if stack and stack[-1][0] == "R":
                        if stack[-1][1] > robots[i][1]:
                            stack[-1][1] -= 1
                        elif stack[-1][1] == robots[i][1]:
                            stack.pop()
                    else:
                        stack.append([robots[i][2], robots[i][1], robots[i][3]])
                else:
                    stack.append([robots[i][2], robots[i][1], robots[i][3]])
    
            stack.sort(key=lambda x: x[2])
    
            return [stack[i][1] for i in range(len(stack))]
  • Golang

    func survivedRobotsHealths(positions []int, healths []int, directions string) []int &#123;
        n := len(positions)
    
        type robot struct &#123;
            p   int
            h   int
            d   byte
            idx int
        &#125;
    
        robots := make([]robot, n)
    
        for i := 0; i < n; i++ &#123;
            robots[i] = robot&#123;positions[i], healths[i], directions[i], i&#125;
        &#125;
    
        sort.Slice(robots, func(i, j int) bool &#123;
            return robots[i].p < robots[j].p
        &#125;)
    
        stack := make([]robot, 0)
    
        for i := 0; i < n; i++ &#123;
            if robots[i].d == 'L' &#123;
                for len(stack) > 0 && stack[len(stack)-1].d == 'R' && stack[len(stack)-1].h < robots[i].h &#123;
                    stack = stack[:len(stack)-1]
                    robots[i].h--
                &#125;
                if len(stack) > 0 && stack[len(stack)-1].d == 'R' &#123;
                    if stack[len(stack)-1].h > robots[i].h &#123;
                        stack[len(stack)-1].h--
                    &#125; else &#123;
                        stack = stack[:len(stack)-1]
                    &#125;
                &#125; else &#123;
                    stack = append(stack, robots[i])
                &#125;
            &#125; else &#123;
                stack = append(stack, robots[i])
            &#125;
        &#125;
    
        ans := make([]int, 0)
        sort.Slice(stack, func(i, j int) bool &#123;
            return stack[i].idx < stack[j].idx
        &#125;)
    
        for i := 0; i < len(stack); i++ &#123;
            ans = append(ans, stack[i].h)
        &#125;
    
        return ans
    &#125;