问题描述

他手里有一个长度为n的序列a,保证它是一个01序列,并执行以下两种操作:
1.单点修改:将位置x上的数翻转(0变1,1变0);
2.前缀修改:将位置1~x上的数翻转(每个数都0变1,1变0)。
他现在想要最小化翻转次数,使得数列上的所有数都变为0。

输入输出

第一行,输入一个数n。
第二行,输入n个数,第i个数表示aia_iai​。

输出最小翻转次数。

代码

import java.util.*;
public class Main{

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++)
            arr[i] = scan.nextInt();
        System.out.println(solution(arr));
    }

    private static int solution(int[] arr) {
        int count = 0;
        boolean flag = true;
       // 从后往前
        for (int i = arr.length-1; i >= 0; i--) {
            if (flag && arr[i] == 0 || !flag && arr[i] == 1) continue;
            else if (flag && arr[i] == 1) {  // 从0到1
                if (i == 0 || arr[i - 1] == 0) count++;  // 下一个又变回0
                else {
                    flag = !flag;
                    count++;
                }
            } else {   // 从1到0
                if (i == 0 || arr[i - 1] == 1) count++;  // 下一个又变回1
                else {
                    flag = !flag;
                    count++;
                }
            }
        }
        return count;
    }
}