黑马程序员技术交流社区

标题: 给定一个字符串输出其中所有的字符及相应个数 [打印本页]

作者: lanwen963    时间: 2014-11-10 01:40
标题: 给定一个字符串输出其中所有的字符及相应个数
本帖最后由 lanwen963 于 2014-11-10 14:38 编辑

给定一个字符串输出其中所有的字符及个数,假定只有英文和空格,例如"welcome to beijing"输出结果w,1
e,3
l,1
c,1
o,2
m,1
t,1
b,1
i,2
j,1
n,1
g,1
  1. #import <Foundation/Foundation.h>

  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.               // 给定字符串
  5.         char str[] = "welcome to beijing";
  6.         
  7.         int i = 0;// while循环的初始化变量
  8.         int count = 1; // 字符数
  9.         
  10.         int index = 0;// 数组c和num的共用下标
  11.         
  12.         char c[100];// 数组c存储字符
  13.         int num[100];// 数组num存储对应出现次数
  14.         
  15.         while (str[i]) {
  16.             int k = 0;// 数组c循环时的初始化变量
  17.             int n = 0;// 标记作用,如果字符出现过,赋值1,跳过下面的if
  18.             // 过滤相同字符和空格
  19.             while(c[k]) {
  20.                
  21.                 if ((c[k] == str[i])||( str[i]==' ')) {
  22.                     n=1;
  23.                     break;
  24.                 }
  25.                 k++;
  26.             }
  27.             
  28.             // 如果是新字符继续下面操作
  29.             if (n == 0) {
  30.                
  31.                 // 将字符赋值给数组c
  32.                     c[index] = str[i];
  33.                
  34.                 // 判断后面是否还有相同字符,有则count加1
  35.                     int j = i + 1;
  36.                
  37.                     while (str[j]) {
  38.                         
  39.                         if (str[j] == str[i]) {
  40.                             count++;
  41.                         }
  42.                         j++;
  43.                     }
  44.                 //记录出现次数
  45.                     num[index] = count;
  46.                 // 跳到下一下标
  47.                     index++;
  48.                     count = 1;
  49.             }
  50.             i++;

  51.         }
  52.         
  53.         // 输出
  54.         for (int i = 0;i<index ; i++) {
  55.             
  56.             printf("%c,%d\n", c[i], num[i]);
  57.         }
  58.     }
  59.     return 0;
  60. }
复制代码

不胜感激,主要是过滤那,有什么好办法吗?面试题,没过~~~

作者: doudou33420    时间: 2014-11-10 02:05
本帖最后由 doudou33420 于 2014-11-10 02:08 编辑

while(c[k])
哥们 你的c数组里的值全是0  你觉得while(0) 可以执行么?更不要说之后的判断了 循环都进不去
这题不用这个复杂
你就把welcome那个字符串存到数组里
1.找出不重复的字符(遇到空格 跳过)
2.便利不重复的字符 一个一个去对应原数组 并记录或者直接printf输出字符以及个数;
或者 费事一点的
1.便利数组给他们排序 相同的放到一起
2.然后再次便利排序过的  然后自己算一下怎么输出

作者: nan46825    时间: 2014-11-10 09:22
doudou33420 发表于 2014-11-10 02:05
while(c[k])
哥们 你的c数组里的值全是0  你觉得while(0) 可以执行么?更不要说之后的判断了 循环都进不去 ...

太厉害了
作者: lanwen963    时间: 2014-11-10 09:33
doudou33420 发表于 2014-11-10 02:05
while(c[k])
哥们 你的c数组里的值全是0  你觉得while(0) 可以执行么?更不要说之后的判断了 循环都进不去 ...

实现到是能实现,我的代码先执行if(n==0)内的语句,执行完,字符数组c中就有值了,while(c[k])就是为了挑选重复的字符,哥们如果不忙的话能不能帮我实现下挑选不重复的字符,忙的话就算了
作者: IOS小菜鸟    时间: 2014-11-10 10:51
标题: 我看看
本帖最后由 IOS小菜鸟 于 2014-11-10 10:58 编辑

不输出空格的话我用OC试了下
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSMutableString *  string= @"uussi   uuuyy   wqkkk kkkd aaaa";
    NSMutableArray * array = [NSMutableArray array];
    for (int i = 0; i<[string length]; i++)
    {
        const char c = [string characterAtIndex:i];
        [array insertObject:[NSNumber numberWithChar:c] atIndex:i];   //把字符串存到数组里面
    }

    for (int i = 0; i<26; i++) {
        int count = [array count];
        char letter = 'a'+i;    //遍历26个字母
        [array removeObject:[NSNumber numberWithChar:letter]];   // 删除数组里面相应的字母比如'a'就会删除数组里面所有'a'.
        int count1 =count - [array count];     //得到'a'的个数
        if (count1) {
            NSLog(@"%c  %d",letter , count1);
        }
    }
    return 0;
}


作者: doudou33420    时间: 2014-11-10 13:41
lanwen963 发表于 2014-11-10 09:33
实现到是能实现,我的代码先执行if(n==0)内的语句,执行完,字符数组c中就有值了,while(c[k])就是为了挑选重 ...

刚睡醒  昨晚没细看你代码 等下试试看
作者: doudou33420    时间: 2014-11-10 14:12
本帖最后由 doudou33420 于 2014-11-10 14:20 编辑
lanwen963 发表于 2014-11-10 09:33
实现到是能实现,我的代码先执行if(n==0)内的语句,执行完,字符数组c中就有值了,while(c[k])就是为了挑选重 ...

思路是这样的   遍历数组 拿数组中一个元素 与其后面所有元素一个一个对比 如果有重复 就把后面的那个元素赋值为0然后输出的时候遇到0 就PASS这样就找到了所有不重复的字符  然后不管你是一个一个跟原数组的元素对比还是怎么样 都可以得到这题的结果
  1. char str[] = "welcome to beijing";
  2.         int count = strlen(str);
  3.         for (int i = 0; i <count; i++) {
  4.             //遇到空格或者 0 的时候 就跳过
  5.             if (str[i] == ' ' || str[i] == '0') {
  6.                 continue;
  7.             }
  8.             //拿当前元素与之后的所有元素对比, 如果有重复  直接把后面那个元素赋值为0
  9.             for (int j = i; j <count; j ++) {
  10.                 if (str[i] ==str[j+1] ) {
  11.                     str[j+1] = '0';
  12.                 }
  13.             }
  14.         }
  15.         
  16.         //直接输出 遇到0就跳过
  17.         for (int i = 0; i<count; i++) {
  18.             if (str[i] == '0') {
  19.                 continue;
  20.             }
  21.             printf("%c",str[i]);
  22.         }
  23.         
复制代码

思路就这么个思路 当然代码可以优化你也可以冒泡排序什么的其他方法来优化循环次数
也可以把赋值过的元素移动到末尾   都可以我懒得搞


作者: lanwen963    时间: 2014-11-10 14:31
doudou33420 发表于 2014-11-10 14:12
思路是这样的   遍历数组 拿数组中一个元素 与其后面所有元素一个一个对比 如果有重复 就把后面的那个元素 ...

谢谢了,这样太简单了,也好理解
作者: lanwen963    时间: 2014-11-10 14:32
根据大家的方法,新的实现为

  1. #import <Foundation/Foundation.h>
  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.         // 给定字符
  5.         char str[] = "welcome to beijing";
  6.         
  7.         int i = 0;// while循环的初始化变量
  8.         int count = 1; // 字符数
  9.         
  10.         int index = 0;// 数组c和num的共用下标
  11.         
  12.         char c[100];// 数组c存储字符
  13.         int num[100];// 数组num存储对应出现次数
  14.         
  15.         while (str[i]) {
  16.             
  17.             if ((str[i]== '0')||( str[i]==' '))
  18.                 {
  19.                              i++;
  20.                             continue;
  21.                 }
  22.                     
  23.                         // 将字符赋值给数组c
  24.                 c[index] = str[i];
  25.                
  26.                 // 判断后面是否还有相同字符,有则count加1
  27.                 int j = i + 1;
  28.                
  29.                 while (str[j]) {
  30.                     
  31.                     if (str[j] == str[i]) {
  32.                         count++;
  33.                         str[j] = '0';
  34.                     }
  35.                     j++;
  36.                 }
  37.                 //记录出现次数
  38.                 num[index] = count;
  39.                 // 跳到下一下标
  40.                 index++;
  41.                 count = 1;
  42.             
  43.             i++;
  44.             
  45.         }
  46.         
  47.         // 输出
  48.         for (int i = 0;i<index ; i++) {
  49.             
  50.             printf("%c,%d\n", c[i], num[i]);
  51.         }
  52.     }
  53.     return 0;
  54. }
复制代码

作者: doudou33420    时间: 2014-11-10 14:33
lanwen963 发表于 2014-11-10 14:31
谢谢了,这样太简单了,也好理解

恩  其实这题你用OC就非常简单了.
foundation框架提供的数组是有remove功能的
直接把重复的删掉.
作者: lanwen963    时间: 2014-11-10 14:36
IOS小菜鸟 发表于 2014-11-10 10:51
不输出空格的话我用OC试了下#import
int main(int argc, const char * argv[]){    NSMutableString *  st ...

谢谢你,这个方法很好啊,可以把字符出现按a~z排列,再输出个数
作者: lanwen963    时间: 2014-11-10 14:40
doudou33420 发表于 2014-11-10 14:33
恩  其实这题你用OC就非常简单了.
foundation框架提供的数组是有remove功能的
直接把重复的删掉. ...

恩,有个大哥给我用OC写了个,还是练习的少,自己想法太少了




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