题目
一个字符串s中只有两种字符’G’和B’
G左B右或者G右B左
但是只能在相邻字符之间进行交换操作,
返回至少需要交换几次
解析
下标和位置从0开始
贪心
只需将第0个出现的G,放在数组第0个位置
或者将第0个出现的B,放在数组第0个位置
双指针
例如: BGGBBGG
当gi指针指向位置0,i指针向右移动,直至指向G字符,移动的次数sum=i-gi
gi++指向下一个G即将到达的位置
当bi指针指向位置0,i指针向右移动,直至指向B字符,移动的次数sum=i-bi
bi++指向下一个B即将到达的位置
只需看完一遍数组,时间复杂度为O(N)
package demo;
import javax.print.attribute.standard.MediaName;
public class Two {
/*
* 基础知识回顾
String str1 = ""; //空字符串 str1.length() 等于 0
String str2 = null; //NULL 没有内存空间
String str3 = " "; //空格串 str2.length() 等于 1
*/
public int minsumcount(String s) {
if (s.length()==0||s.equals("")) {
return 0;
}
char[] sss=s.toCharArray();
// G左B右
int gi=0;
int sumg=0;
for(int i=0;i<sss.length;i++) {
if(sss[i]=='G') {
sumg += i-(gi++);
}
}
// B左G右
int bi=0;
int sumb=0;
for(int i=0;i<sss.length;i++) {
if(sss[i]=='B') {
sumb += i-(bi++);
}
}
// 至少返回的次数
return Math.min(sumg, sumb);
}
public static void main(String[] args) {
String s="GGBBGGGBGGBBBBBB";
Two two=new Two();
System.out.println(two.minsumcount(s));
}
}