题目描述:
农场有n只鸡鸭排为一个队伍,鸡用“C”表示,鸭用“D”表示。当鸡鸭挨着时会产生矛盾。需要对所排的队伍进行调整,使鸡鸭各在一边。每次调整只能让相邻的鸡和鸭交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:CCDCC->CCCDC->CCCCD这样就能使之前的两处鸡鸭相邻变为一处鸡鸭相邻,需要调整队形两次。
题目链接:https://www.nowcoder.com/questionTerminal/f87616abbac44842b43f24ddd3cf49e8
输入描述:
输入一个长度为N,且只包含C和D的非空字符串。
输出描述:
使得最后仅有一对鸡鸭相邻,最少的交换次数
示例1
输入
CCDCC
输出
2
思路:
对于字符串str="CCDCC",输出的结果为str中C的下标之和 - str排好序后的C的下标,最终累加。
CCDCC--->CCCCD
C的下标为0,变换后为0;(0-0=0)
C的下标为1,变换后为1;(1-1=0)
C的下标为3,变换或为2;(3-2=1)
C的下标为4,变换后为3. (4-3=1)
注意点:对于DDDCD这种情况,仅仅需要移动一次,变为DDDDC,即需要考虑将C放在左边和将D放在左边两种情况。
代码如下。
/**
* Main
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
sc.close();
int countC=0;// 统计C移动的总次数
int countD=0;
int leftC=0;//C在最左边
int leftD=0;
for(int i=0; i<str.length();i++)
{
if(str.charAt(i)=='C')
{
countC = countC + (i - leftC);//C的原始坐标 减去 变换到左边的C坐标。
leftC++;
}
}
for(int j=0; j<str.length(); j++)
{
if(str.charAt(j) =='D')
{
countD = countD + (j - leftD);
leftD++;
}
}
System.out.println(Math.min(countC, countD));
}
}