A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天逛论坛,看到坛友提问:
(1)打印一个字符串的全字符组合情况,原始字符串中没有重复字符
(2)例如:原始字符串是"def", 打印得到下列所有组合情况:
         "d" "e" "f" "de" "df" "ed" "ef" "fd" "fe" "def" "dfe" "edf" "efd" "fde" "fed"
尝试着用C做这道题,但纠结了半天没做出来,最后还是用OC做出来的
谁用C做过这道题吗?求看源码,用C怎么做?
以下是用OC做的源码和结果:
  1. //
  2. //  main.m
  3. //  OC输出所有组合
  4. // 题目:
  5. //(1)打印一个字符串的全字符组合情况,原始字符串中没有重复字符
  6. //(2)例如:原始字符串是"def", 打印得到下列所有组合情况:
  7. //"d" "e" "f" "de" "df" "ed" "ef" "fd" "fe" "def" "dfe" "edf" "efd" "fde" "fed"
  8. //------------------------------------------------------------------------------------
  9. // 思路分析:
  10. //(1)单个字符“d","e","f"
  11. // (2)取两个字符"de" "df" "ed" "ef" "fd" "fe"
  12. // (3)取三个字符"def" "dfe" "edf" "efd" "fde" "fed"
  13. // (4)由上面可分析得出,第3个字符组,是第1个与第2个互相组合得到的,依次类推,第4个字符组,是第1个与第3个互相组合得到
  14. // (5)所以用递归方法最好,可循环嵌套调用此方法
  15. //

  16. #import <Foundation/Foundation.h>
  17. //声明函数
  18. void groupDisplay(NSMutableArray *arr1,NSMutableArray *arr2,int loopTimes);

  19. int main(int argc, const char * argv[]) {
  20.     @autoreleasepool {
  21.         //定义一个字符数组,保存输入的英文字符
  22.         char str1[100];
  23.         //创建可变数组一,用于保存原数组拆分得到的字母,例如def拆分后"d","e","f"
  24.         NSMutableArray *arr1=[NSMutableArray array];
  25.         //创建可变数组二,用于保存组合,例如"de" "df" "ed" "ef" "fd" "fe"
  26.         NSMutableArray *arr2=[NSMutableArray array];
  27.         //提示输入
  28.         NSLog(@"请输入字符串,字符串中不能有重复字母:");
  29.         
  30.         //例如死循环,如果输入的字符串有重复字母,则提示需要一直输入,直到输入无误
  31.         while (YES) {
  32.             //将输入的字符串保存到字符数组str1[100]中
  33.             scanf("%s",str1);
  34.             //创建Boolean变量用于保存状态,是否有重复字母,有重复字母赋值为NO
  35.             BOOL flag=YES;
  36.             //利用内外循环遍历字符数组中的,如果有任意两个重复,则flag赋值为NO,退出循环,且提示重新输入
  37.             for (int i=0; i<strlen(str1); i++) {
  38.                 for (int j=i+1; j<strlen(str1); j++) {
  39.                     //如果有重复字母,则退出内循环,且提示重新输入
  40.                     if (str1[i]==str1[j]) {
  41.                         NSLog(@"输入的字符串中字母有重复,请重新输入:");
  42.                         flag=NO;
  43.                         break;
  44.                     }
  45.                 }
  46.                 //通过标志flag判断,如果有重复flag为NO,退出外循环
  47.                 if (flag==NO) {
  48.                     break;
  49.                 }
  50.             }
  51.             //通过标志flag判断,如果没有重复,flag标志为YES,退出while(YES)死循环,向下执行代码
  52.             if (flag==YES) {
  53.                 break;
  54.             }
  55.         }
  56.         
  57.         //遍历str1字符数组,输出单个字母
  58.         for (int i=0; i<strlen(str1); i++) {
  59.             //将str1中的每个字母转变为字符串,并添加到可变数组arr1和arr2中
  60.             NSString *temp=[NSString stringWithFormat:@"%c",str1[i]];
  61.             [arr1 addObject:temp];
  62.             [arr2 addObject:temp];
  63.         }
  64.         
  65.         //逐个打印单个字母
  66.         NSLog(@"%@",arr1);
  67.         
  68.         //定义变量loopTimes,如果loopTimes等于0,则函数结束调用
  69.         int loopTimes=(int)[arr1 count]-1;
  70.         
  71.         //调用函数,将字母组合中的所有情况输出
  72.         groupDisplay(arr1,arr2,loopTimes);

  73.     }
  74.     return 0;
  75. }

  76. //实现函数,函数传入数组arr1,数组arr2,和循环次数loopTimes,arr2中字符检测,如果不包含arr1中字符,则组合保存
  77. void groupDisplay(NSMutableArray *arr1,NSMutableArray *arr2,int loopTimes){
  78.     //如果递归循环loopTimes为0,则结束递归,返回
  79.     if (loopTimes==0) {
  80.         return;
  81.     }
  82.     //定义一个可变数组,保存arr1和arr2字符组合
  83.     NSMutableArray *mArrTemp=[NSMutableArray array];
  84.    
  85.     //外循环次数由传入的形参arr1长度控制
  86.     for (int i=0; i<[arr1 count]; i++) {
  87.         //内循环次数由传入的形参arr2长度控制
  88.         for (int j=0; j<[arr2 count]; j++) {
  89.             //定义可变字符串,用于临时拼接arr1和arr2的字符串
  90.             NSMutableString *mStrTemp=[NSMutableString string];
  91.             //循环检测arr2[j]中是否包含arr[i]
  92.             NSRange rang=[arr2[j] rangeOfString:arr1[i]];
  93.             //如果arr2[j]中不包含arr[i],则将两者拼接到mStrTemp可变字符串中,再将mStrTemp保存到数组mArrTemp中
  94.             if (rang.location==NSNotFound) {
  95.                 [mStrTemp appendString:arr1[i]];
  96.                 [mStrTemp appendString:arr2[j]];
  97.                
  98.                 [mArrTemp addObject:mStrTemp];
  99.             }
  100.         }
  101.     }
  102.     //递归次数减1;
  103.     loopTimes--;
  104.     //输出保存到可变数组mArrTemp中的字符串
  105.     NSLog(@"%@",mArrTemp);
  106.     //递归调用函数,如果loopTimes=0,则不会向下执行
  107.     groupDisplay(arr1, mArrTemp,loopTimes);
  108. }
复制代码
输出结果截图:



结果.jpg (29.73 KB, 下载次数: 18)

输出结果

输出结果

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马