第十四篇:Objective-C 知识回顾架算法

主要算法大纲
问题一: 请实现字符串反转的算法。

主要思路:两个指针分别指向字符串的一头一尾地址,然后交换两个指针的内容,交换完毕后,指针从两端向中间移动,重复交换和移动操作。直到 begin 指针的地址大于等于 end 指针,就结束程序完成交互。

// code 
void characterReverse(char* cha) {
    char* begin = &cha[0];
    char* end = cha + strlen(cha) - 1;
    
    while (begin < end) {
        char temp = *begin;
        *(begin++) = *end;
        *(end--) = temp;
    }
}

// usage
- (void)learnCharacterReverse {
    char cha[]= "Hello,World";
    characterReverse(cha);
    printf("reverse result is %s \n", cha);
}
问题二: 请实现链表的反转。

主要思路:创建两个指针,一个用来存放反转的新链表,一个用来存当前链表。利用头插法,把旧链表上的数据一个个插入新链表的头部。特别注意一点在于,要先存链表的下一个结点,不然插入之后会丢失链表数据。

// .h
#import <Foundation/Foundation.h>
struct Node {
    int data;
    struct Node* next;
};
@interface ChainReverse : NSObject
// 链表反转
struct Node* chain_reverse(struct Node* head);
// 构建一个列表
struct Node* constructionChains(void);
// 打印链表
void printChain(struct Node *head);
@end


// .m文件
#import "ChainReverse.h"
@implementation ChainReverse
// 链表反转
struct Node* chain_reverse(struct Node* head) {
    // 定义遍历指针,初始化头结点
    struct Node* p = head;
    // 反转后的链表头部
    struct Node *newH = NULL;
    
    // 遍历链表
    while (p != NULL) {
        // 先记录下一个结点
        struct Node* temp = p->next;
        // 当前结点的 nex 执行新链表的头部
        p->next = newH;
        // 更改新链表头部为当前结点
        newH = p;
        // 移动 p 指针
        p = temp;
    }
    return newH;
};
// 构建一个列表
struct Node* constructionChains(void) {
    struct Node* head = NULL;
    struct Node* cur = NULL;
    
    for (int i = 1 ; i < 5;  i++) {
        struct Node *node = malloc(sizeof(struct Node));
        node->data = i;
        node->next = NULL;
        
        if (head == NULL) {
            head = node;
        } else {
            cur->next = node;
        }
        cur = node;
    }
    return head;
}
// 打印链表
void printChain(struct Node *head) {
    struct Node* cur = NULL;
    cur = head;
    
    while (cur != NULL) {
        printf("%i \n", cur->data);
        cur = cur->next;
    };
    printf("===============\n");
}

@end


// 用法

- (void)learnChainReverse {
    struct Node* head = constructionChains();
    printChain(head);
    struct Node* newHead = chain_reverse(head);
    printChain(newHead);
}

问题三:请实现两个有序数组合并成一个有序数据的算法。

算法思路:分别从两个有序数组头部开始取数组,对比大小,把小的值插入新数组,然后小的值所在数据角标+1,如此重复,直到其中一方数组没有数据了,把另一个数组剩余的值全部插入新数组,完成合并。


// 将有序数据 a 和 b 的值合并到一个数据 result当中,且仍然保持有序
void mergeList(int a[], int aLen, int b[], int bLen, int result[]) {
    int p = 0; // 记录数组 a 的位置
    int q = 0; // j遍历数组 b 的位置
    int i = 0; // 记录当前存储 z 位置
    while (p < aLen && q < bLen) {
        if (a[p] < b[q]) {
            result[i] = a[p];
            p++;
        } else {
            result[i] = b[q];
            q++;
        }
        i++;
    }
    while (p < aLen) {
        result[i] = a[p];
        p++;
        i++;
    }
    
    while (q < bLen) {
        result[i] = b[q];
        q++;
        i++;
    }
}
问题四:请用哈希算法来实现查找字符串中第一个只出现一次的字符。

算法思路:所谓 hash 算法,就是利用哈希函数做一个映射,从而由 key 经过 f(key) 高效的找到结果。所以我们可以把字符当成 ASCII 码作为 key 并且当成一个数组的脚本,数组的 value 就是出现的次数。

char findFirstChar(char *cha) {
    // 用来移动的指针
    char *p = cha;
    // 初始化一个数组
    int array[256];
    for (int i = 0 ; i < 256; i++) {
        array[i] = 0;
    }
    // 结果存放处
    char result = '\0';
    // 遍历并且给数组赋值
    while (*p != '\0') {
        array[*(p++)]++;
    }
    p = cha;
    // 查找value 为 1 的字符
    while (*p != '\0') {
        if (array[*p] == 1) {
            result = *p;
            break;
        }
        p++;
    }
    return result;
}

问题五:查找两个子视图的共同父视图。

算法思路:先遍历找出两个子视图的所有父视图,存于两个数组;将两个数组进行反序,然后从下标 0 的位置开始对比两个数组,将相同的视图存在另一个新数组中,直到两个数组第一次出现不同视图,就可以终止循环。

- (void)learnFindCommonSupperView {
    NSMutableArray *mutableArray_A = [NSMutableArray new];
    NSMutableArray *mutableArray_B = [NSMutableArray new];
    NSMutableArray *mutableArray_Common = [NSMutableArray new];
    
    UIView *currentA = self.labelA;
    while (currentA.superview != nil) {
        [mutableArray_A addObject:currentA.superview];
        currentA = currentA.superview;
    }
    
    UIView *currentB = self.labelB;
    while (currentB.superview != nil) {
        [mutableArray_B addObject:currentB.superview];
        currentB = currentB.superview;
    }
    // 步骤的关键在于反序查找,直到第一个不同的视图终止
    mutableArray_A = [[[mutableArray_A reverseObjectEnumerator] allObjects] mutableCopy];
    mutableArray_B = [[[mutableArray_B reverseObjectEnumerator] allObjects] mutableCopy];
    
    for (int i = 0; i < mutableArray_A.count && i < mutableArray_B.count; i++) {
        UIView *a = mutableArray_A[i];
        UIView *b = mutableArray_B[i];
        
        if (a == b) {
            [mutableArray_Common addObject:a];
            // 为了标记已经找到的共同父视图,标记为红色
            a.backgroundColor = [UIColor redColor];
            a.layer.borderWidth = 1;
            a.layer.borderColor = [UIColor whiteColor].CGColor;
        } else {
            break;
        }
    }
    
    NSLog(@"一共有 %lu 个父视图", (unsigned long)mutableArray_Common.count);
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,101评论 1 32
  • 在校招题解的算法篇中,还整理了部分《剑指offer》原题,这里均用Java实现。 校招面试题解 剑指offer题解...
    厘米姑娘阅读 22,052评论 18 153
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,802评论 0 13
  • 我一直觉的自己的人生不该如此平凡,淡而无味,激不起一层浪,或是自己的不努力吧,亦或是对于生活我太过宽容自己,总以为...
    雪景球阅读 150评论 0 1
  • 一定要和喜欢的人在一起么?未必! 小鱼,是我的同学,她为人比较单纯,性格也比较内敛,不怎么爱说话,当班级里面在说谁...
    追觅阳光阅读 376评论 0 0