iOS常見算法筆試問題

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;
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容