1、 给出一个由小写字母组成的字符串,把所有连续出现的 2 个 a 替换成 bb ( 2 个 b ),但是对于超过两个连续的 a,那么这些字符都不作替换。例如:

bad -> bad (一个a,不替换)

baad -> bbbd (替换成bb)

baaad -> baaad (连续三个a,不替换)

apaapaaapaa -> apbbpaaapbb (这里连续的a出现了4次,只有第二段和最后一段被替换)

- (NSString *)replace:(NSString *)str {
    // CODE HERE
    NSMutableString *retString = [NSMutableString stringWithString:str];
    // 准备替换的字符串
    NSString *replaceString = @"bb";
    // 正则表达式 (^a{2}[^a]) 以aa(第三个字母不是a)开头,([^a]a{2}[^a]) 字符串中间的aa(前后都不是a),([^a]a{2}$) 以aa结尾(倒数第三个字母不是a)
    NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:@"(^a{2}[^a])|([^a]a{2}[^a])|([^a]a{2}$)" options:NSMatchingReportProgress error:nil];
    NSRange range;
    do {
        range = [regular rangeOfFirstMatchInString:retString options:NSMatchingReportProgress range:NSMakeRange(0, retString.length)];
        if (range.length == 4) {// 替换中间的aa
            [retString replaceCharactersInRange:NSMakeRange(range.location + 1, 2) withString:replaceString];
        } else if (range.length > 0) {
            if (range.location == 0) {// 替换开头的aa
                [retString replaceCharactersInRange:NSMakeRange(range.location, 2) withString:replaceString];
            } else {// 替换结尾的aa
                [retString replaceCharactersInRange:NSMakeRange(retString.length - 2, 2) withString:replaceString];
            }
        }
    } while (range.length > 0);
    return retString;
}
 
 
2、 给出一个字符串,其中只包含括号(大中小括号 “()[]{}” ),括号可以任意嵌套。如果同样的左右括号成对出现并且嵌套正确,那么认为它是匹配的。例如:

()  ->  TRUE  (匹配)

[()]  ->  TRUE  (匹配,括号可以嵌套)

()()   ->  TRUE     (匹配,括号可以并列排列)

({}([]))  ->  TRUE   (匹配,括号可以任意嵌套,大括号不必在外)

)   ->  FALSE    (不匹配,缺少左括号)

(}   ->  FALSE     (不匹配,左右括号不一样)

{)(}   ->  FALSE     (不匹配,左右括号相反)

- (BOOL)isMatch:(NSString *)str {
    // CODE HERE
    // 采用进站出站的思想,遍历完字符串时如果array为空则匹配成功,否则失败
    NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < str.length; i++) {
        int tag = [self createTagWithString:[str substringWithRange:NSMakeRange(i, 1)]];
        if (tag != 0) {
            int lastTag = [[array lastObject] intValue];
            if ((lastTag + tag) == 0) {
                [array removeLastObject];
            } else {
                [array addObject:@(tag)];
            }
        }
    }
    return array.count == 0;
}
 
- (int)createTagWithString:(NSString *)str {
    if ([str isEqualToString:@"("]) {
        return -1;
    } else if ([str isEqualToString:@")"]) {
        return 1;
    } else if ([str isEqualToString:@"["]) {
        return -2;
    } else if ([str isEqualToString:@"]"]) {
        return 2;
    } else if ([str isEqualToString:@"{"]) {
        return -3;
    } else if ([str isEqualToString:@"}"]) {
        return 3;
    }
    return 0;
}
 

3、写一个函数,找出一个数组中出现次数超过一半的数字,如果数字不存在,则返回-1。例如:

[0, 1, 2]             -->     -1   (每个数字只出现1次)

[0, 1, 2, 1]         -->     -1   (1出现了2次,刚好一半)

[0, 1, 2, 1, 1]     -->     1    (1出现了3次,超过一半)

(注:数组不是按从小到达排序的,也许排序之后更容易找到这个数,但是有没有更好、更快的方法在不重新调整顺序的情况得到结果?)

- (int)mode:(NSArray *)array {
    // CODE HERE
    // 将集合中得数字转存到字典中,数字做key,对应出现的次数做value
    NSMutableDictionary *modeMap = [NSMutableDictionary dictionary];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *key = obj;
        id count = modeMap[key];
        int i = [(NSNumber *)count intValue];
        [modeMap setObject:@(i + 1) forKey:key];
    }];
    __block int retInt = -1;
    // 遍历字典,找出其中value大于集合一半的key并返回
    [modeMap.allKeys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *key = obj;
        int mode = [modeMap[key] intValue];
        if (mode > array.count / 2) {
            retInt = key.intValue;
            *stop = YES;
        }
    }];
    return retInt;
}
 

iOS常见算法笔试问题的更多相关文章

  1. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...

  2. 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

    今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...

  3. Hadoop学习笔记—12.MapReduce中的常见算法

    一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...

  4. [Machine Learning] 机器学习常见算法分类汇总

    声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多 ...

  5. acm常见算法及例题

    转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题  初期:一.基本算法:     (1)枚举. (poj17 ...

  6. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  7. IOS常见的三种回调方法介绍

    认识下三种IOS常见的回调模式. 代理模式作为IOS中最常见的通讯模式,代理几乎无处不在. 这里有一个数组,我们首先通过代理的方式将数组传递到其他方法中去. 设置协议及方法 @protocol Cal ...

  8. paper 12:机器学习常见算法分类汇总

    机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里南君先生为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困 ...

  9. iOS 常见知识点(三):Lock

    iOS 常见知识点(一):Runtime iOS 常见知识点(二):RunLoop 锁是最常用的同步工具.一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单 ...

随机推荐

  1. 其他信息: 未找到源,不过,未能搜索部分或所有事件日志。 若要创建源,您需要用于读取所有事件日志的权限以确保新的源名称是唯一的。 不可访问的日志: Security。

    其他信息: 未找到源,不过,未能搜索部分或所有事件日志.  若要创建源,您需要用于读取所有事件日志的权限以确保新的源名称是唯一的.  不可访问的日志: Security. System.Diagnos ...

  2. Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory'

    1.根本原因在http://askubuntu.com/questions/606732/php-fatal-error-uncaught-exception-pdoexception-with-me ...

  3. Oracle索引失效问题:WHERE C1='' OR C2 IN(SubQuery),并发请求时出现大量latch: cache buffers chains等待

    问题描述: 项目反馈某功能响应时间很长,高峰期时系统整体响应很慢... 获取相应的AWR,问题确实比较严重,latch: cache buffers chains等待,因为这些会话SQL执行时间太长, ...

  4. Configure PPPoE on CentOS7

    Why? I prefer using ethernet to Wifi to access internet. But, I'm afraid, sometimes I have to use Wi ...

  5. Flex air修改外部xml文件 (转)

    AIR的文件操作不难,看完教程应该可以满足你对文件的所有基本操作.这篇教程主要以实际操作中遇到的情况来讲解 我们想想文件操作都会有什么内容,无非是创建,修改,删除,移动,拷贝.在这个过程中我们会涉及到 ...

  6. PL/SQLDeveloper导入导出Oracle数据库方法

    前一篇博客介绍了Navicat工具备份Oracle的方法,这篇博客介绍一下使用PL/SQL Developer工具导入导出Oracle数据库的方法. PL/SQL Developer是Oracle数据 ...

  7. OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)

    开源与成熟商业的瓦片地图服务(TMS  2  WMTS),都有如下共同的特性,基本成为了标准: (1) 坐标系:WGS84 (2) 投影:墨卡托投影(Marcator,正轴等角圆柱投影) ------ ...

  8. ZYNQ学习之——MIO

    1.GPIO基础知识 Zynq7000 系列芯片有 54 个 MIO(multiuse I/O) ,它们分配在 GPIO 的 Bank0 和Bank1 隶属于 PS 部分, 这些 IO 与 PS 直接 ...

  9. Android开发-无法新建Activity及新建后编译错误

    下载了其他的工程后,新建Activity时无法进行下一步,报错:“This template requires a minimum SDK version of at least 7, and the ...

  10. Mono 异步加载数据更新主线程

    主要是用 async和 await 调用 RunOnUiThread来更新. 调用函数: //异步加载数据开始 doInBackground (); //异步加载数据开始end protected a ...