黑马程序员技术交流社区
标题:
有没有人会呀
[打印本页]
作者:
Bin_OFlcR
时间:
2016-3-27 22:05
标题:
有没有人会呀
(1)打印一个字符串的全字符组合情况,原始字符串中没有重复字符
(2)例如:原始字符串是"def", 打印得到下列所有组合情况:
"d" "e" "f" "de" "df" "ed" "ef" "fd" "fe" "def" "dfe" "edf" "efd" "fde" "fed"
作者:
张立鹏
时间:
2016-3-27 22:08
感觉好难,先
作者:
muzipiao
时间:
2016-3-28 13:50
我用OC写了一个,你看看
//
// main.m
// OC输出所有组合
// 题目:
//(1)打印一个字符串的全字符组合情况,原始字符串中没有重复字符
//(2)例如:原始字符串是"def", 打印得到下列所有组合情况:
//"d" "e" "f" "de" "df" "ed" "ef" "fd" "fe" "def" "dfe" "edf" "efd" "fde" "fed"
//------------------------------------------------------------------------------------
// 思路分析:
//(1)单个字符“d","e","f"
// (2)取两个字符"de" "df" "ed" "ef" "fd" "fe"
// (3)取三个字符"def" "dfe" "edf" "efd" "fde" "fed"
// (4)由上面可分析得出,第3个字符组,是第1个与第2个互相组合得到的,依次类推,第4个字符组,是第1个与第3个互相组合得到
// (5)所以用递归方法最好,可循环嵌套调用此方法
//
#import <Foundation/Foundation.h>
//声明函数
void groupDisplay(NSMutableArray *arr1,NSMutableArray *arr2,int loopTimes);
int main(int argc, const char * argv[]) {
@autoreleasepool {
//定义一个字符数组,保存输入的英文字符
char str1[100];
//创建可变数组一,用于保存原数组拆分得到的字母,例如def拆分后"d","e","f"
NSMutableArray *arr1=[NSMutableArray array];
//创建可变数组二,用于保存组合,例如"de" "df" "ed" "ef" "fd" "fe"
NSMutableArray *arr2=[NSMutableArray array];
//提示输入
NSLog(@"请输入字符串,字符串中不能有重复字母:");
//例如死循环,如果输入的字符串有重复字母,则提示需要一直输入,直到输入无误
while (YES) {
//将输入的字符串保存到字符数组str1[100]中
scanf("%s",str1);
//创建Boolean变量用于保存状态,是否有重复字母,有重复字母赋值为NO
BOOL flag=YES;
//利用内外循环遍历字符数组中的,如果有任意两个重复,则flag赋值为NO,退出循环,且提示重新输入
for (int i=0; i<strlen(str1); i++) {
for (int j=i+1; j<strlen(str1); j++) {
//如果有重复字母,则退出内循环,且提示重新输入
if (str1[i]==str1[j]) {
NSLog(@"输入的字符串中字母有重复,请重新输入:");
flag=NO;
break;
}
}
//通过标志flag判断,如果有重复flag为NO,退出外循环
if (flag==NO) {
break;
}
}
//通过标志flag判断,如果没有重复,flag标志为YES,退出while(YES)死循环,向下执行代码
if (flag==YES) {
break;
}
}
//遍历str1字符数组,输出单个字母
for (int i=0; i<strlen(str1); i++) {
//将str1中的每个字母转变为字符串,并添加到可变数组arr1和arr2中
NSString *temp=[NSString stringWithFormat:@"%c",str1[i]];
[arr1 addObject:temp];
[arr2 addObject:temp];
}
//逐个打印单个字母
NSLog(@"%@",arr1);
//定义变量loopTimes,如果loopTimes等于0,则函数结束调用
int loopTimes=(int)[arr1 count]-1;
//调用函数,将字母组合中的所有情况输出
groupDisplay(arr1,arr2,loopTimes);
}
return 0;
}
//实现函数,函数传入数组arr1,数组arr2,和循环次数loopTimes,arr2中字符检测,如果不包含arr1中字符,则组合保存
void groupDisplay(NSMutableArray *arr1,NSMutableArray *arr2,int loopTimes){
//如果递归循环loopTimes为0,则结束递归,返回
if (loopTimes==0) {
return;
}
//定义一个可变数组,保存arr1和arr2字符组合
NSMutableArray *mArrTemp=[NSMutableArray array];
//外循环次数由传入的形参arr1长度控制
for (int i=0; i<[arr1 count]; i++) {
//内循环次数由传入的形参arr2长度控制
for (int j=0; j<[arr2 count]; j++) {
//定义可变字符串,用于临时拼接arr1和arr2的字符串
NSMutableString *mStrTemp=[NSMutableString string];
//循环检测arr2[j]中是否包含arr[i]
NSRange rang=[arr2[j] rangeOfString:arr1[i]];
//如果arr2[j]中不包含arr[i],则将两者拼接到mStrTemp可变字符串中,再将mStrTemp保存到数组mArrTemp中
if (rang.location==NSNotFound) {
[mStrTemp appendString:arr1[i]];
[mStrTemp appendString:arr2[j]];
[mArrTemp addObject:mStrTemp];
}
}
}
//递归次数减1;
loopTimes--;
//输出保存到可变数组mArrTemp中的字符串
NSLog(@"%@",mArrTemp);
//递归调用函数,如果loopTimes=0,则不会向下执行
groupDisplay(arr1, mArrTemp,loopTimes);
}
复制代码
结果.jpg
(29.73 KB, 下载次数: 6)
下载附件
2016-3-28 13:49 上传
输出结果
作者:
拼搏
时间:
2016-3-28 14:44
好厉害,向你学习
作者:
18508421145
时间:
2016-3-28 22:11
厉害!学到了
作者:
hy415161
时间:
2016-3-28 22:56
好厉害啊!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2