链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
众所周知,Dilhao是世界上数一数二的颓颓大师,非常喜欢和朋友们一起打牌。这天,Dilhao和他的朋友们在打扑克。Dilhao抓了n张牌拿在手上,Dilhao有强迫症,他想让自己手上的牌变得更好看更顺眼。
具体的,扑克分为四种花色,红桃,方片,黑桃,梅花。其中红桃和方片为红色,黑桃和梅花为黑色。Dilhao认为,所有红色的牌连在一起才是更好看的。现在Dilhao可以把手上的任意两张牌交换位置,他想问你最少交换几次可以让手上的牌所有红色牌都是连在一起的?
输入描述:
第一行一个整数n,代表Dilhao手里有n张牌
第二行n个大写字母,表示Dilhao手牌的花色
保证其中只包括H(红桃),D(方片),S(黑桃),C(梅花)
输入数据保证1≤n≤1e5(没错,Dilhao的手就是有这么大)
输出描述:
输出一个整数,表示Dilhao最少交换几次才能让手牌变好看。
-
示例1
-
输入
12
HDSCHDCSDHSC
- 输出
2
题解:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int min=Integer.MAX_VALUE;
int n=scanner.nextInt();
int red=0;
String s=scanner.next();
char c[]=s.toCharArray();
for(int i=0;i<n;i++){
if(c[i]=='H'||c[i]=='D'){
red++;
}
}
char tail=c[0];
int temp=0;
for(int i=0;i<red;i++){
if(c[i]=='H'||c[i]=='D'){
temp++;
}
}
min=Math.min(min,red-temp);
for(int i=red;i<n;i++){
if(c[i]=='H'||c[i]=='D'){
temp++;
}
if(c[i-red]=='H'||c[i-red]=='D'){
temp--;
}
min=Math.min(min,red-temp);
}
System.out.println(min);
}
}
思路:
- 本题数据量10^5,暴力必然超时,本题为需要移动的次数,不需要关系如何移动,博主思路为找到红色牌总牌数最大的一块区域,该区域黑牌数量则为移动次数,则运用一个滑动的窗口,用变量随时记录红色牌的数量,即可完成O(n)时间复杂度的运算。