【牛客】4. 01串修改

腾讯音乐娱乐集团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) {
        //变为全为0
        int 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);

        //变为全为1
        int 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);
    }
}

你可能感兴趣的:(#,力扣及OJ,Java相关,java,开发语言)