黑马程序员技术交流社区

标题: **面试题**求字符串中A、B、C、D出现的次数,并按次数排序 [打印本页]

作者: 水木清华hm    时间: 2015-1-28 22:12
标题: **面试题**求字符串中A、B、C、D出现的次数,并按次数排序
#import <stdio.h>
// 定义一个主函数,作为程序的入口
int main()
{
    // 定义一个数组array用来存放输入的字符串
    char array[100];
   
    // 提示输入一个字符串
    printf("请输入一串字符串:\n");
   
    // 接收输入的字符串,并赋值给数组array
    scanf("%s",array);
   
    // 定义两个变量用于for循环条件变量
    int i,j;
   
    // 定义四个变量用来存放ABCD出现的次数
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
   
    // 定义变量length用来存放输入字符串的长度
    unsigned long length = strlen(array);
   
    // 定义for循环,当i小于字符串长度时,执行循环体,i加1
    for (i = 0; i<length; i++) {
        
        // 统计A出现的次数
        if (array == 'A') {
            a++;
        }
        
        // 统计B出现的次数
        else if (array == 'B'){
            b++;
        }
        
        // 统计C出现的次数
        else if (array == 'C'){
            c++;
        }
        
        // 统计D出现的次数
        else if (array == 'D'){
            d++;
        }
    }
   
    // 定义一个数组x用来存放ABCD出现的次数
    int x[4] = {a,b,c,d};
   
    // 定义temp用于冒泡排序标记排序趟数
    int temp;
   
    // 冒泡排序  将a,b,c,d降序排序,i表示排序的趟数,j表示每趟排序的比较次数
    for (i = 0; i<3; i++)
    {
        for(j = 0;j<3-i;j++)
        {
            if (x[j] < x[j+1])
            {
                // 当前一个元素小于后一个元素时,交换它们的位置
                temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
        }
    }
   
    // 定义一个数组y用来存放ABCD标志
    char y[4];
   
    // 将数组x与数组y的出现次数和标志一一对应
    for (i = 0; i<4; i++)
    {
        // 如果出现a次,则y='A'
        if(x == a && y[0] != 'A'&& y[1] != 'A' && y[2] != 'A' && y[3] != 'A')
        {
            y = 'A';
        }
        // 如果出现b次,则y='B'
        else if(x == b && y[0] !='B' && y[1] != 'B' && y[2] != 'B' && y[3] != 'B')
        {
            y = 'B';
        }
        // 如果出现c次,则y='C'
        else if(x == c && y[0] !='C' && y[1] != 'C' && y[2] != 'C' && y[3] != 'C')
        {
            y = 'C';
        }
        // 如果出现d次,则y='D'
        else
        {
            y = 'D';
        }
    }
   
    // 降序打印输出每个字母出现的次数
    for (i = 0; i<4; i++)
    printf("%c出现%d次\n",y,x);
   
    return 0;
}


作者: peanutgao    时间: 2015-1-29 09:38
楼主,你确定你这代码可以编译通过;P
作者: 华少code    时间: 2015-1-29 10:30
好乱啊!
作者: 水木清华hm    时间: 2015-1-29 10:35
peanutgao 发表于 2015-1-29 09:38
楼主,你确定你这代码可以编译通过

这是找的前几期的学长的,他们学能通过
作者: 水木清华hm    时间: 2015-1-29 10:36

因为是别人写的,我不会,也不敢乱改,有待优化
作者: peanutgao    时间: 2015-1-29 12:26
水木清华hm 发表于 2015-1-29 10:35
这是找的前几期的学长的,他们学能通过

你可以在xcode运行下,应该会有好多错误
作者: 水木清华hm    时间: 2015-1-29 13:15
peanutgao 发表于 2015-1-29 12:26
你可以在xcode运行下,应该会有好多错误

没有Xcode,只是给大家带来一点思路,抛砖引玉
作者: 水木清华hm    时间: 2015-1-29 13:17
peanutgao 发表于 2015-1-29 09:38
楼主,你确定你这代码可以编译通过

不确定,仅限参考
作者: xiezhongmin    时间: 2015-1-30 13:03
感谢楼主的思路,下面是本人修改后的正确代码:
   #include <stdio.h>
#include <string.h>
// 定义一个主函数,作为程序的入口
int main()
{
    // 定义一个数组array用来存放输入的字符串
    char array[100];
   
    // 提示输入一个字符串
    printf("请输入一串字符串:\n");
   
    // 接收输入的字符串,并赋值给数组array
    scanf("%s",array);
   
    // 定义两个变量用于for循环条件变量
    int i,j;
   
    // 定义四个变量用来存放ABCD出现的次数
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
   
    // 定义变量length用来存放输入字符串的长度
   long lengths = strlen(array);
   
    // 定义for循环,当i小于字符串长度时,执行循环体,i加1
    for (i = 0; i<lengths; i++) {
        
        // 统计A出现的次数
        if (array[i] == 'A') {
            a++;
        }
        
        // 统计B出现的次数
        else if (array[i] == 'B'){
            b++;
        }
        
        // 统计C出现的次数
        else if (array[i] == 'C'){
            c++;
        }
        
        // 统计D出现的次数
        else if (array[i] == 'D'){
            d++;
        }
    }
   
    // 定义一个数组x用来存放ABCD出现的次数
    int x[4] = {a,b,c,d};
   
    // 定义temp用于冒泡排序标记排序趟数
    int temp;
   
    // 冒泡排序  将a,b,c,d降序排序,i表示排序的趟数,j表示每趟排序的比较次数
    for (i = 0; i<3; i++)
    {
        for(j = 0;j<3-i;j++)
        {
            if (x[j] < x[j+1])
            {
                // 当前一个元素小于后一个元素时,交换它们的位置
                temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
        }
    }
   
    // 定义一个数组y用来存放ABCD标志
    char y[4];
   
    // 将数组x与数组y的出现次数和标志一一对应
    for (i = 0; i<4; i++)
    {
        // 如果出现a次,则y='A'
        if(x[i] == a )
        {
            y[i] = 'A';
        }
        // 如果出现b次,则y='B'
         if(x[i] == b )
        {
            y[i] = 'B';
        }
        // 如果出现c次,则y='C' if(x[i] == c)
         if(x[i] == c)
        {
            y[i] = 'C';
        }
        // 如果出现d次,则y='D'
         if (x[i] == d)
        {
            y[i] = 'D';
        }
        printf("%c出现%d次\n",y[i],x[i]);

    }

  
   
    return 0;
}

没有做精简,若有更精简的代码请多多交流!!


作者: 1026238004    时间: 2015-1-30 13:20
顶顶!!!!
作者: 水木清华hm    时间: 2015-1-30 13:44

谢谢                                   
作者: Zeus-S    时间: 2015-1-30 15:25
面试题?我的基础测试里面就有这道题,完全没思路,多谢分享
作者: 水木清华hm    时间: 2015-1-30 17:55
Zeus-S 发表于 2015-1-30 15:25
面试题?我的基础测试里面就有这道题,完全没思路,多谢分享

希望可以帮到你
作者: 萝莉最有爱    时间: 2015-1-30 18:25
学习了 受教了
作者: 水木清华hm    时间: 2015-1-31 18:17

希望可以对你有帮助




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2