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;
}
}