腾讯音乐娱乐集团2023校园招聘技术类岗位编程题四
【牛客】4. 01串修改
给定一个只包含’0’和’1’两种字符的字符串,每次操作可以选择相邻的两个字符,将它们同时变成’0’或者同时变成’1’。请问最少多少次操作后,所有的字符都相同?
示例1
输入例子:“1001101”
输出例子:2
题解
思路: 字符串全变成0和全变成1俩种变法取二者较小。
以1001101为例:ceil()为向上取整
- 全变成1,把0去掉,[00,0],需要ceil(“00”.length/2)+ceil(“0”.length/2)
- 全变成0,把1去掉,[1,11,1],需要ceil(“1”.length/2)+ceil(“11”.length/2)+ceil(“1”.length/2)
- 二者取较小者
import java.util.Arrays;
import java.util.Scanner;public class Solution {public static void main(String[] args) {Scanner in = new Scanner(System.in);int res = minOperations(in.next());System.out.println(res);}public static int minOperations(String str) {//变为全为0int ans0 = 0;String[] split0 = str.split("[0]+");//匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。System.out.println(Arrays.toString(split0));for (int i = 0; i < split0.length; i++) {//记录全变0次数if (split0[i].length() % 2 == 0) {ans0 += split0[i].length() / 2;}else {ans0 += split0[i].length() / 2 + 1;}}System.out.println(ans0);//变为全为1int ans1 = 0;String[] split1 = str.split("[1]+");System.out.println(Arrays.toString(split1));for (int i = 0; i < split1.length; i++) {if (split1[i].length() % 2 == 0) {ans1 += split1[i].length() / 2;} else {ans1 += split1[i].length() / 2 + 1;}}System.out.println(ans1);return Math.min(ans0, ans1);}
}