012串修改
题目描述

给定一个只包含'0''1'两种字符的字符串,每次操作可以选择相邻的两个字符,将它们同时变成'0'或者同时变成'1'。
请问最少多少次操作后,所有的字符都相同?
输入例子:
"1001101"
输出例子:
2
输出解释:全部为1的情况,第一次操作,将第2个和第3个相邻变成1;第二次操作,将倒数第二和倒数第一个字符变为1

关键解题思路
两种情况,全部为1的操作次数sum1,全部为0的操作次数sum2
当全部为1时,遇到1:i+1;遇到0:i+2且操作次数加1
Solution

import java.util.*;


public class Solution {
   
    /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return int整型 */
    // private int sum1,sum0 = 0;
    public int minOperations (String str) {
   
        // write code here
        int[] arr = new int[str.length()];
        for (int i=0; i<str.length();i++){
   
            arr[i] = Integer.valueOf(String.valueOf(str.charAt(i)));
        }
        //两种情况,全部为1的操作次数sum1,全部为0的操作次数sum2
        //当全部为1时,遇到1:i+1;遇到0:i+2且操作次数加1
        int sum1=0;
        for (int i=0; i<str.length();){
    
            if(arr[i]==1){
   
                i = i+1;
            }
            else{
   
                i = i+2;
                sum1++;
            }
        }
        int sum0 = 0;
        for (int i=0; i<str.length();){
   
            if(arr[i]==0){
   
                i = i+1;
            }
            else{
   
                i = i+2;
                sum0++;
            }
        }
        return Math.min(sum0,sum1);
    }
}

013连续子数组数量
题目描述
在这里插入图片描述
关键解题思路
使用双指针和滑动窗口,计算子数组含有2因子和5因子的数目来确定是乘积末尾0的数量。
再通过去除的left对应元素的2因子数量和5因子数量,left++后重新获取连续子数组

Solution

import java.util.*;


public class Solution {
   
    /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型ArrayList * @param x int整型 * @return int整型 */
    //使用双指针和滑动窗口,计算子数组含有2因子和5因子的数目来确定是乘积末尾0的数量。
    public int getSubarrayNum (ArrayList<Integer> a, int x) {
   
        int mod = 1000000007;
        int ans = 0;
        int left, right;
        left=right = 0;
        int count2= 0;  //含有2因子数量
        int count5= 0;  //含有5因子数量
        for(; right<a.size(); right++){
   
            int num = a.get(right);
            count2 += getFactorCount(num, 2);
            count5 += getFactorCount(num, 5);
            //当count2和count5的最小数大于等于x时表示乘积末尾零数量大于等于x
            while(Math.min(count2,count5)>=x){
   
                //a.size() - right个子数组为合法连续子数组
                ans = (ans + a.size()-right) % mod;
                // System.out.println(ans);
                //删除此时的left对应元素的2因子数量和5因子数量
                num = a.get(left);
                count2 -=getFactorCount(num, 2);
                count5 -=getFactorCount(num,5);
                left++;
            }

        }
        return ans;
}   
    public int getFactorCount (int x, int y) {
   
        int count = 0;
        while(x%y==0){
   
            count++;
            x =x/y;
        }
        return count;

    }
}