S1第9场
题目描述:
牛牛酷爱循环右移操作,但是牛牛的电脑寄存器坏掉了,无法实现正常的循环右移操作,只能实现区间反转操作,现在牛牛有一个长度为n的字符串,他想进行循环右移k位的操作,你能告诉牛牛,他最少对这个字符串进行几次区间反转操作能实现循环右移k位呢。反转操作指字符串某一区间 [ L , R ] \left[ L,R \right] [L,R]内的字符反转,例如“123456”,区间[3,5]进行反转字符串变为“125436”。假设字符串每一位都不同。给定一个字符串长度n和循环右移次数k,求最少反转次数。
思路: 这题简直太毒瘤了,擦~
12345 → 45321 12345\to 45321 12345→45321 反转两次就够了,而不是三次:1、43215 ;2、45123;相对应的 23451也是两次;
class Solution {
public:
int solve(int n, int k) {
// write code here
int t = k%n;
if(k==0||t==0) return 0;
if(n==2) return 1;
if(t==1||t==2||t==n-1||t==n-2) return 2;
return 3;
}
};
题意:
牛牛从牛毕那里拿了一根长度为n的白木板,木板被等分成了n段(没有被切割,只是虚拟划分成了n段),其中有些段被牛毕用颜料染成了黑色。
牛牛非常不喜欢黑色,它找来了一桶清洗剂决定对木板进行清洗,但是牛牛发现自己的清洗剂最多只能清洗m段。
清洗完后,牛牛会把木板锯成纯色的几段。例如假设木板是 (黑黑黑白白白白黑黑黑 ),就会被锯成(黑黑黑)(白白白白)(黑黑黑)三段。
牛牛想知道,它足够聪明地清洗木板,能获得的纯白色木板的最大长度是多少。
输入:
给定n,m两个整数
和一个长度为n的数组a,为1表示白色,为0表示黑色
( 1 ≤ n ≤ 1 0 6 , 1 ≤ m ≤ n ) ( 0 ≤ a i ≤ 1 ) (1 \leq n\leq 10^{6} , 1 \leq m\leq n )(0 \leq a_{i} \leq 1) (1≤n≤106,1≤m≤n)(0≤ai≤1)
输出:
一行一个数字表示能获得的纯白色木板的最大长度是多少。
直接双指针就好了(尺取法)
class Solution {
public:
int solve(int n, int m, vector<int>& a) {
// write code here
int ans=0,cnt=0;
for(int i=0,j=0;j<n;j++){
if(a[j]==0) cnt++;
while(cnt>m&&i<=j){
cnt -= (a[i]==0);
i++;
}
ans = max(ans,j-i+1);
}
return ans;
}
};