两字母交叉最少问题

问题:假设某字符串str=“ABBBA”,只由字母A,B组成,且无规律,只要求长度大于0,长度合理范围内不限。
str1=”ABBBA”,不同字母之间接触的次数是2次;
str2=”ABABA”,不同字母之间接触的次数是4次;
str1=”ABBAA”,不同字母之间接触的次数是2次;

要使接触的次数最少,就要移动字母,比如str2=”ABABA”,相邻的两个字母互换一次,也就是移动一次,并且只有相邻的字母才能互换,那么str2=”ABABA”→“AAABB”移动了3次,过程为:
ABABA→ABA*AB*→A*AB*AB→AA*AB*B(星号引着的是互换的两个字母)。

要求:用最少的移动次数,使接触次数最少。

public class Main {

    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        System.out.println("请无序连续输入A,B若干个,中间无空格隔开:");
        String str=sc.nextLine();


        int lengh=str.length();
        int times_left=0;//记录将全部A移到左边所需要的接触次数
        int times_right=0;//记录将全部A移到右边所需要的接触次数
        int times_A=0;//记录目前A的个数
        int sign_A=-1;//记录目前遍历到的位置
        //把A移到左边
        for(int i=0;i<lengh;i=sign_A+1){
            sign_A=str.indexOf('A',i);//从i开始查找,返回当前A的在字符串中的下标
            if(sign_A==-1)//没有'A'则退出循环
                break;
            //某个A要移到正确的位置需要移动搞得次数是它前面B的个数
            times_left+=sign_A-times_A;//sign_A-times_A也就是前面有多少个B

            times_A++;//查找到一个A就加1
        }

        times_A=0;
        sign_A=lengh;
        //把全部A都移到右边
        for(int i=lengh-1;i>=0;i=sign_A-1){
            sign_A=str.lastIndexOf('A',i);//从字符串的i位置向前(左)查找。
            if(sign_A==-1)
                break;
            //因为返回的sign是正序的,所以要lengh-1-sign_A得到倒序的下标
            times_right+=lengh-1-sign_A-times_A;
            times_A++;
        }
        //下面判断哪个比较小,并且输出移动后的字符串
        if(times_left>times_right){
            for(int i=0;i<times_A;i++)
                System.out.print("B");
            for(int i=0;i<lengh-times_A;i++)
                System.out.print("A");
            System.out.println();
            System.out.println(times_right);
        }
        else{
            for(int i=0;i<times_A;i++)
                System.out.print("A");
            for(int i=0;i<lengh-times_A;i++)
                System.out.print("B");
            System.out.println();
            System.out.println(times_left);
        }
    }
}

结果实例:
这里写图片描述

思路:接触最少不就是把两种字母分别放到左边或者右边,那么到底是A放左边还是右边,我直接两种情况都算一下,选移动次数小的,我没看出规律,只会这么写。

### 回答1: 可以使用逻辑运算符 == 来比较字母是否相等。例如: ```c char letter1 = 'a'; char letter2 = 'b'; if (letter1 == letter2) { printf("The letters are equal.\n"); } else { printf("The letters are not equal.\n"); } ``` 输出结果为: ``` The letters are not equal. ``` ### 回答2: 在C语言中,我们可以使用关系运算符“==”来比较字母是否相等。在C语言中,字母是以ASCII码的形式存储和表示的。每个字母都有一个唯一的ASCII码值。 我们可以通过将要比较的字母与一个预定的字母进行比较,如果它们的ASCII码值相等,那么它们就是相等的。下面是一个简单的示例代码: ```c #include <stdio.h> int main() { char letter1, letter2; printf("输入第一个字母:"); scanf("%c", &letter1); printf("输入第二个字母:"); scanf(" %c", &letter2); // 注意加一个空格,用于忽略之前的换行符 if (letter1 == letter2) { printf("字母相等。\n"); } else { printf("字母不相等。\n"); } return 0; } ``` 在上面的代码中,我们首先声明了个字符变量`letter1`和`letter2`,用于存储用户输入的字母。然后,使用`scanf`函数分别从用户那里获取这字母。 接下来,我们使用`if`语句将`letter1`和`letter2`进行比较。如果它们相等,则输出“字母相等。”,否则输出“字母不相等。”。 需要注意的是,在进行字符比较时,需要注意输入和输出时的空白字符(如空格、换行符等),可以使用空格进行字符的输入,也可以使用`scanf`函数的格式修饰符`" %c"`,其中的空格可以忽略之前的换行符。 以上便是使用C语言比较字母是否相等的简单示例代码。 ### 回答3: 要比较C语言中的字母是否相等,可以使用条件语句和逻辑运算符来完成。在C语言中,每个字母都有对应的ASCII码值,可以通过比较字母的ASCII码值来确定它们是否相等。 首先,需要定义个变量来存储这字母。可以使用char类型的变量来表示字母。例如,定义个变量letter1和letter2。 接下来,可以使用条件语句(if语句)来比较字母的ASCII码值。使用逻辑运算符(==)来判断个值是否相等。如果字母的ASCII码值相等,则它们是相等的;否则,它们不相等。 以下是比较字母是否相等的C代码示例: #include <stdio.h> int main() { char letter1, letter2; printf("请输入第一个字母:"); scanf("%c", &letter1); printf("请输入第二个字母:"); scanf(" %c", &letter2); // 注意%前的空格,用于清除缓冲区的回车符 if (letter1 == letter2) printf("这字母相等\n"); else printf("这字母不相等\n"); return 0; } 在代码中,先要求用户输入字母,然后使用条件语句分别判断它们的ASCII码值是否相等,最后输出比较结果。使用相等运算符(==)比较个变量的值是否相等。注意,在用户输入第二个字母时,需在%c之前加一个空格,用于清除输入缓冲区的回车符。这样做是为了确保输入的字母不受前一个输入的影响。 希望以上解答对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsjweiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值