实习+秋招刷题012-014

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;

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值