【每周日LeetCode_382】位操作

146 阅读2分钟

100215. 按键变更的次数

链接

class Solution:
    def countKeyChanges(self, s: str) -> int:
        s = s.lower()
        res = 0
        for i in range(1, len(s)):
            if s[i] != s[i-1]:
                res += 1
        return res 
class Solution:
    def countKeyChanges(self, s: str) -> int:
        return sum(a != b for a, b in pairwise(s.lower()))

————————————

class Solution:
    def countKeyChanges(self, s: str) -> int:
        if len(s) == 1:
            return 0
        s = s.lower()
        res = 0
        for i in range(1, len(s)):
            if s[i] == s[i-1]:
                continue 
            else:
                res += 1
        return res 

100206. 子集中元素的最大数量

题目链接

class Solution:
    def maximumLength(self, nums: List[int]) -> int:
        
        # 先统计个数
        dic = Counter(nums)
        res = 1
        if 1 in dic:
            if dic[1] % 2 == 1:
                res = max(1, dic[1])
            else:
                res = max(1, dic[1] - 1)
        
        for i in range(len(nums)):
            if nums[i] == 1:
                continue                
            temp = sqrt(nums[i])   # 从中间 外扩
            cnt = 1
            while dic[temp] >= 2:
                cnt += 2
                temp = sqrt(temp)
            if cnt > res:
                res = cnt 
        return res 

            

——————————

从小 往大 找 超时

class Solution:
    def maximumLength(self, nums: List[int]) -> int:
        
        # 先统计个数
        dic = Counter(nums)
        res = 1
        if 1 in dic:
            if dic[1] % 2 == 1:
                res = max(1, dic[1])
            else:
                res = max(1, dic[1] - 1)
        
        nums.sort()
        for i in range(len(nums)):
            if nums[i] == 1:
                continue 
            if dic[nums[i]] >= 2:                
                temp = nums[i]
                cnt = 0
                while temp in nums:
                    # print(temp)
                    if dic[temp] >= 1 and temp * temp not in nums:
                        cnt += 1
                        dic[temp] -= 1
                        if cnt > res:
                            res = cnt
                            break
                    elif dic[temp] >= 2:
                        cnt += 2
                        dic[temp] -= 2
                    temp = temp * temp  
        return res    

100195. Alice 和 Bob 玩鲜花游戏

链接

Alice Bob x Bob Alice y

要 找 规律

class Solution:
    def flowerGame(self, n: int, m: int) -> int:
        # 必须 一奇 一偶 
        return n * m // 2

——————————————————

超时, 要用 公式

class Solution:
    def flowerGame(self, n: int, m: int) -> int:
        res = 0
        for i in range(1, n+1):
            for j in range(1, m+1):
                if (i + j) % 2 == 1:
                    res += 1
        return res 

100179. 给定操作次数内使剩余元素的或值最小

链接

image.png

class Solution:
    def minOrAfterOperations(self, nums: List[int], k: int) -> int:
        res = 0
        mask = 0
        for b in range(max(nums).bit_length() - 1, -1, -1):
            mask |= 1 << b  # 第 b 位 有没有 可能是 0
            cnt = 0
            and_res = -1  # 与的结果  全 1 !!!
            for num in nums:
                and_res &= num & mask # 检查 mask 的 第 b 位
                if and_res:
                    cnt += 1  # 合并
                else:
                    and_res = -1  # 下一轮 的 重置 
            if cnt > k:
                res |= 1 << b  # 答案 的 这个 比特 位 必须 为 1
                mask ^= 1 << b  # 后续 不再讨论 第 b 位 
        return res

image.png

class Solution {
public:
    int minOrAfterOperations(vector<int>& nums, int k) {
        int res = 0, mask = 0;
        for (int b = 29; b >= 0; --b){
            mask |= 1 << b;
            int cnt = 0, and_res = -1;
            for (int num : nums){
                and_res &= num & mask;
                if (and_res){
                    ++cnt;  // 有效 合并
                }else{
                    and_res = -1; // 重置  下一轮  全1
                }
            }
            if (cnt > k){
                res |= 1 << b;  // 答案 的 这个 比特 位 必须 是1
                mask ^= 1 << b;  // 后面 不考虑 这个 比特 位
            }
        }
        return res;
    }
};