开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
题目 leetcode.cn/
- 给你一个仅由字符
'0'和'1'组成的字符串s。一步操作中,你可以将任一'0'变成'1',或者将'1'变成'0'。 - 交替字符串 定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串
"010"是交替字符串,而字符串"0100"不是。 - 返回使
s变成 交替字符串 所需的 最少 操作数。
示例
-
输入: s = "0100",输出:1解释: 如果将最后一个字符变为 '1' ,s 就变成 "0101" ,即符合交替字符串定义。
-
输入: s = "10",输出:0解释:s 已经是交替字符串。
-
输入: s = "1111",输出:2解释:需要 2 步操作得到 "0101" 或 "1010" 。
提示
1 <= s.length <= 100000s[i]是'0'或者'1'
代码
function minOperations(s: string): number {
let sum0 = 0;
let sum1 = 0;
for(let i = 0; i < s.length; i++){
if(i%2 === 0 && s[i] !== '0'){
sum0++;
}else if(i%2 === 1 && s[i] !== '1'){
sum0++;
}
}
for(let i = 0; i < s.length; i++){
if(i%2 === 0 && s[i] !== '1'){
sum1++;
}else if(i%2 === 1 && s[i] !== '0'){
sum1++;
}
}
return sum0 > sum1 ? sum1 : sum0;
};
思路
- 将给到的一串由
0和1组成的无序字符串生成为交替二进制字符串,交替的二进制字符串是有序的,分为两种排序方式- 由
0开头,01010101010101010101010 - 由
1开头,10101010101010101010101
- 由
- 也就是说,无论给到的字符串是什么顺序的,最后转换成交替的二进制字符串都是以上两种之一,最后只要比较替换成上面的哪一种的操作最少就可以
- 定义两个变量,分别用来保存替换成以
0开头和以1开头的二进制字符串所需要的操作数 - 遍历整个字符串,如果是以
0开头的字符串,偶数位一定都是0,说以如果偶数位不是0的需要替换成0,操作次数+1,奇数位一定是1,奇数位不是1的需要替换成1,操作数也要+1 - 同样,如果是以
1开头的字符串,偶数位一定都是1,说以如果偶数位不是1的需要替换成1,操作次数+1,奇数位一定是0,奇数位不是0的需要替换成0,操作数也要+1 - 最后返回两个操作数中最小的就可以