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. 给定操作次数内使剩余元素的或值最小
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
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;
}
};