与oc字符串有关的习题以及答案

来源:互联网 发布:行测怎么提速 知乎 编辑:程序博客网 时间:2024/05/16 17:56
//  Copyright (c) 2015年 JiWuChao. All rights reserved.
//

#import "JWCTest.h"

@implementation JWCTest
/*
 1. 判断中间目录是否存在 
- (BOOL)isPath:(NSString *)path includeMiddleDirectory:(NSString *)dir{
    NSInteger ret = 0;
    NSArray *arr = [path componentsSeparatedByString:@"/"];
    for (int i = 0; i < arr.count; i ++) {
        if ([[arr objectAtIndex:i] compare:dir] == NSOrderedSame) {
            ret = YES;
            break;
        }
        else
            ret = NO;
    }

    return ret ;
}

/*
 2.将一个字符串数组中的元素组合成一个合法路径(10分)
 已知一个数组存放的是目录名字,要求组合成一个合法路径
 比如:数组中存放的是 hh  JJ  iOS
 返回  /hh/JJ/iOS
 */
/*
 思路:
    把数组中的每一个元素赋值给一个可变字符串,然后在可变字符串中的第一个元素位置添加一个 ’/‘,然后把添加过‘/’的可变字符串依次添加到可变数组当中,添加完之后,再把数组根据空格分隔成为字符串输出,完成所需的效果
 */
- (NSString *)joinPathOfComponents:(NSArray *)comp{
   
    NSMutableString *str = [[NSMutableString alloc]init];
    NSMutableArray *arr = [[NSMutableArray alloc]init];
    for (int i = 0; i < comp.count; i++) {
        str=[NSMutableString stringWithString: comp[i]];
        [str insertString:@"/" atIndex:0];
        [arr addObject:str];
    }
   // NSLog(@"%@",arr);
     NSString *str1 = [arr componentsJoinedByString:@""];
    return str1;
}

/*3. 传入一段字符串,字符串中可能有任何字符,要求找出字符串中最长的单词,即最长的连续英语字母,返回该单词的字母个数(20分)
 
 比如:
 输入 Yes, I hate the guy who make this fucking examination paper!
 返回:11 即examination的长度。
 */
/*
 本题的主要方法是在字符串划分成数组的时候的依据,是空格,逗号,和感叹号,分离之后就可以根据数组的每个元素的长来求出最长的长度。
 其中,划分的时候原来都用componentsSeparatedByString,这只能根据一个元素划分,在此运用componentsSeparatedByCharactersInSet:它需要的参数是一个集合,这就可以把空格,逗号,和感叹号做成一个集合,一次性的就可以把字符串分成数组
 */
-(NSUInteger)numbersOfLongestWordInString:(NSString *)s{
    NSInteger count = 0;
    
    NSArray *arr = [s  componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@", !"]];
   // NSLog(@"arr=%@",arr);
    for (NSString * obj in arr) {
        if (obj.length > count) {
            count = obj.length;
        }
    }
    return count;
}

/*
 4.输入左边数字就输出右边对应字母 (20分)
 
 1 - A
 2 - B
 …..
 26 - Z
 27 - AA
 52 - AZ
 53 - BA
 54 - BB
 ….
 702 - ZZ
 …
 8888888888-ABTCNCWV
 输入左边数字就输出右边对应字母;
 */
- (void)printEnglish:(NSInteger) n{
    NSMutableString *muStr = [[NSMutableString alloc]init];
    NSMutableString *muStr2 = [[NSMutableString alloc]init];
    NSInteger m1;
    while (n) {
        m1 = (n-1)%26;
        n = (n-1)/26;
     [ muStr appendFormat: @"%c",(unichar)(m1+65)];
    }
    
    for (NSInteger i = muStr.length-1; i >=0 ; i--) {
        [muStr2  appendFormat:@"%c",[muStr characterAtIndex:i] ];
    }
    NSLog(@"第四题:%@",muStr2);
 }
    /*
     5.将字符串中单词后移(10分)
     已知字符串中的单词以空格隔开,将字符串向右移动指定单词数,首尾循环
     
     如:string传入@"Hi man welcome to my Home", bits传入2
     
     返回:@"to my Home Hi man welcome"
     */
- (NSString *)displacemetWordInString:(NSString *)string forBits:(NSUInteger)bits{
    //先把字符串根据空格分开
    NSArray *arr =[string componentsSeparatedByString:@" "];
    
    
    NSMutableArray *muArr = [[NSMutableArray alloc]init];
    NSInteger i = 0,j = 0;
    //从数组最后取出bits个元素循环放在数组中
        for ( i= arr.count-1; i >= 0&&j < bits; j++,i--) {
            [muArr addObject:arr[i]];
          //  NSLog(@"%@",muArr);
        }
    //由于循环放到数组中的元素是从原数组中的最后一位依次取出的,和题意不符,所以需要把顺序交换过来
    for (NSInteger a = 0; a <= muArr.count/2 ; a++) {
        [muArr exchangeObjectAtIndex:a withObjectAtIndex:[muArr count]-1];
    }
    //把原数组中剩余的元素放到数组中去
    for (NSInteger a = 0; a <= arr.count-1-bits; a++) {
        [muArr addObject:arr[a]];
    }
    //NSLog(@"%@",muArr);
    
    //把数组根据空格合并
    NSString *st = [muArr componentsJoinedByString:@" "];
    return st;
    }
    
/*
 6.找出出现最多的单词 (10分)
 已知字符串中的单词以空格隔开,找出字符串中出现次数最多的单词,将该单词和单词出现的次数
 拼接成一个新字符串,返回新字符串。
 
 传入:@"drink your drink don't drink others drink"
 
 返回:@"drink4"
 */
- (NSString *)mostWordInString:(NSString *)String{
    NSArray *arr= [[NSArray alloc]init];
    arr = [String componentsSeparatedByString:@" "];
   // NSLog(@"%@",arr);
    
    NSInteger maxCou = 0;
    
    NSMutableArray  *strArr = [[NSMutableArray alloc]init];
    for (NSInteger j = 0; j < arr.count ; j++) {
       NSInteger count = 0;
    for (NSInteger i = 0; i < arr.count; i++) {
        if ([arr[i] compare:arr[j]]==NSOrderedSame) {
            count++;
        }
        if (count > maxCou) {
            maxCou = count;
            [strArr addObject:arr[j]];
        }
    }
}
        NSString *ss = [NSString stringWithFormat:@"%@%lu",[strArr lastObject],maxCou];
    return ss ;
}

/*
 7.打印杨辉三角(10分)
 输入 7
 1
 1 1
 1 2  1
 1 3  3  1
 1 4  6  4  1
 1 5 10 10  5 1
 1 6 15 20 15 6 1
 NSLog打印
 
 */

- (void)printYangHuiTriangle:(int) n{
    int a[100][100];
    for (int i = 0 ; i < n; i++) {
        for (int j = 0 ; j <= i; j++) {
            if (i ==j||(j==0&&i!=j)) {
                a[i][j] = 1;
            }else {
                a[i][j] = a[i-1][j]+a[i-1][j-1];
            }
        }
        
    }
    for (int i = 0 ; i < n; i++) {
        for (int j = 0 ; j <= i; j++){
            printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
    
}

/*
 8 传入一段字符串,把相同的字符按出现顺序,归在一起,并压缩(20分)
 
 比如:
 
 输入 SamSameCome
 
        SamSameCome
 输出:
 
 S2a2m3e2C1o1
 
 返回值为压缩后的结果,比如S2a2m3e2C1o1
 */
- (NSString *)compressString:(NSString *)s{

    NSMutableString *muStr = [[NSMutableString alloc]init];
    //取出字符串的第i个元素,赋值给ch1
    for (int i = 0; i < s.length; i++) {
       unichar ch1 = [s characterAtIndex:i];
        NSInteger count = 0;
        
        //计算出ch1在字符串中出现的次数,用count记录
        for (int j = 0; j < s.length; j++) {
           unichar ch2 = [s characterAtIndex:j];
            if (ch1 == ch2) {
                count++;
            }
        }
        //把字符和它出现的次数count合成一个字符串
        NSString *ss = [NSString stringWithFormat:@"%C%ld",ch1,(long)count];
        
        //如果没有存在则把字符和它的出现的次数添加到可变字符串中
        if ([muStr containsString:ss] == 0) {
            [muStr appendString:ss];
        }
    }
    return muStr ;
}

/*
 9 根据输入的内容用NSLog打印出菱形(10分)
 */
//count 表示正方形边长

//flagString 组成菱4形的边

//blankString 组成背景正方形

//比如 [class print:5 blankString:@“+”flagString:@“#”];
/*
 + + # + +
 
 + # + # +
 
 # + + + #
 
 + # + # +
 
 + + # + +
 */

-(void)print:(NSInteger)count blankString:(NSString*)blankString flagString:(NSString*)flagString{
    NSMutableString *muStr = [[NSMutableString alloc]init];
    for (int i = 0; i < count; i++) {
        for (int j = 0 ; j < count; j++) {
            if ((i+j == (count - 1)/2)||(j-i == (count - 1)/2)||(i-j==(count - 1)/2)||(i+j==count+1)) {
                [muStr appendFormat:@"%@  ",flagString];
            }else{
                [muStr appendFormat:@"%@  ",blankString];
            }
        }
        [muStr appendFormat:@"%c",'\n'];
    }
    
    NSLog(@"第九题:\n%@",muStr);
    
}

/*
 10. 求一个字符串s的最大连续递减数字子串。(20)
 
 比如:
 输入 12345986fffwf3210abcd 输出为 3210
 输入 abcd765bbw135797531f12345 输出为 765
 
 //如果有多个相同的最大数字串那么返回最后一个
 
 */
- (NSString *)subNumberString:(NSString *)string{
    NSMutableString *muStr = [[NSMutableString alloc]initWithString:string];
    NSInteger count = 0;
    NSInteger index = 0;
    //先判断字符串中是否是字符,如果是字符则换成空格
    for (int i = 0; i < muStr.length; i++) {
        if ([muStr characterAtIndex:i] > '9' || [muStr characterAtIndex:i]  <'0') {
            [muStr replaceCharactersInRange:NSMakeRange(i, 1) withString:@" "];
        }
        
    }
    //根据空格把字符串分成数组
    NSArray *arr = [muStr componentsSeparatedByString:@" "];
    for (int i = 0; i < arr.count; i++) {
        NSInteger flag = 1;//设置一个标记
        
        //如果数组中的第i个元素不为空
        if ([arr[i]compare:@"" ]!=NSOrderedSame) {
            //数组中的元素是字符串,让字符串中的每一个元素进行比较
         for (int j = 0; j < [arr[i] length]-1; j++) {
                //如果是前面的一位小于等于后面的一位,则跳出循环,并且把flag标记为0
                if ([arr[i] characterAtIndex:j] <= [arr[i] characterAtIndex:j+1]) {
                    flag = 0;
                    break;
                }
            }
        }
            //判断如果flag不为0和比较已存在的值的大小满足条件则返回下标
            if (flag == 1 && [arr[i] integerValue] >= count) {
                count = [arr[i] integerValue];
                index = i;
        }
        
    }
 
    return arr[index];
}

0 0
原创粉丝点击