第十四篇:Objective-C 知識回顧架算法

主要算法大綱
問題一: 請實現(xiàn)字符串反轉(zhuǎn)的算法突颊。

主要思路:兩個指針分別指向字符串的一頭一尾地址,然后交換兩個指針的內(nèi)容光涂,交換完畢后,指針從兩端向中間移動拧烦,重復(fù)交換和移動操作忘闻。直到 begin 指針的地址大于等于 end 指針,就結(jié)束程序完成交互恋博。

// 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);
}
問題二: 請實現(xiàn)鏈表的反轉(zhuǎn)齐佳。

主要思路:創(chuàng)建兩個指針,一個用來存放反轉(zhuǎn)的新鏈表交播,一個用來存當(dāng)前鏈表重虑。利用頭插法,把舊鏈表上的數(shù)據(jù)一個個插入新鏈表的頭部秦士。特別注意一點在于,要先存鏈表的下一個結(jié)點永高,不然插入之后會丟失鏈表數(shù)據(jù)隧土。

// .h
#import <Foundation/Foundation.h>
struct Node {
    int data;
    struct Node* next;
};
@interface ChainReverse : NSObject
// 鏈表反轉(zhuǎn)
struct Node* chain_reverse(struct Node* head);
// 構(gòu)建一個列表
struct Node* constructionChains(void);
// 打印鏈表
void printChain(struct Node *head);
@end


// .m文件
#import "ChainReverse.h"
@implementation ChainReverse
// 鏈表反轉(zhuǎn)
struct Node* chain_reverse(struct Node* head) {
    // 定義遍歷指針,初始化頭結(jié)點
    struct Node* p = head;
    // 反轉(zhuǎn)后的鏈表頭部
    struct Node *newH = NULL;
    
    // 遍歷鏈表
    while (p != NULL) {
        // 先記錄下一個結(jié)點
        struct Node* temp = p->next;
        // 當(dāng)前結(jié)點的 nex 執(zhí)行新鏈表的頭部
        p->next = newH;
        // 更改新鏈表頭部為當(dāng)前結(jié)點
        newH = p;
        // 移動 p 指針
        p = temp;
    }
    return newH;
};
// 構(gòu)建一個列表
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);
}

問題三:請實現(xiàn)兩個有序數(shù)組合并成一個有序數(shù)據(jù)的算法。

算法思路:分別從兩個有序數(shù)組頭部開始取數(shù)組命爬,對比大小曹傀,把小的值插入新數(shù)組,然后小的值所在數(shù)據(jù)角標(biāo)+1饲宛,如此重復(fù)皆愉,直到其中一方數(shù)組沒有數(shù)據(jù)了,把另一個數(shù)組剩余的值全部插入新數(shù)組,完成合并幕庐。


// 將有序數(shù)據(jù) a 和 b 的值合并到一個數(shù)據(jù) result當(dāng)中,且仍然保持有序
void mergeList(int a[], int aLen, int b[], int bLen, int result[]) {
    int p = 0; // 記錄數(shù)組 a 的位置
    int q = 0; // j遍歷數(shù)組 b 的位置
    int i = 0; // 記錄當(dāng)前存儲 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++;
    }
}
問題四:請用哈希算法來實現(xiàn)查找字符串中第一個只出現(xiàn)一次的字符久锥。

算法思路:所謂 hash 算法,就是利用哈希函數(shù)做一個映射异剥,從而由 key 經(jīng)過 f(key) 高效的找到結(jié)果瑟由。所以我們可以把字符當(dāng)成 ASCII 碼作為 key 并且當(dāng)成一個數(shù)組的腳本,數(shù)組的 value 就是出現(xiàn)的次數(shù)冤寿。

char findFirstChar(char *cha) {
    // 用來移動的指針
    char *p = cha;
    // 初始化一個數(shù)組
    int array[256];
    for (int i = 0 ; i < 256; i++) {
        array[i] = 0;
    }
    // 結(jié)果存放處
    char result = '\0';
    // 遍歷并且給數(shù)組賦值
    while (*p != '\0') {
        array[*(p++)]++;
    }
    p = cha;
    // 查找value 為 1 的字符
    while (*p != '\0') {
        if (array[*p] == 1) {
            result = *p;
            break;
        }
        p++;
    }
    return result;
}

問題五:查找兩個子視圖的共同父視圖歹苦。

算法思路:先遍歷找出兩個子視圖的所有父視圖,存于兩個數(shù)組督怜;將兩個數(shù)組進行反序殴瘦,然后從下標(biāo) 0 的位置開始對比兩個數(shù)組,將相同的視圖存在另一個新數(shù)組中号杠,直到兩個數(shù)組第一次出現(xiàn)不同視圖蚪腋,就可以終止循環(huán)。

- (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;
    }
    // 步驟的關(guān)鍵在于反序查找,直到第一個不同的視圖終止
    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];
            // 為了標(biāo)記已經(jīng)找到的共同父視圖,標(biāo)記為紅色
            a.backgroundColor = [UIColor redColor];
            a.layer.borderWidth = 1;
            a.layer.borderColor = [UIColor whiteColor].CGColor;
        } else {
            break;
        }
    }
    
    NSLog(@"一共有 %lu 個父視圖", (unsigned long)mutableArray_Common.count);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末究流,一起剝皮案震驚了整個濱河市辣吃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芬探,老刑警劉巖神得,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偷仿,居然都是意外死亡哩簿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門酝静,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节榜,“玉大人价说,你說我怎么就攤上這事讼油。” “怎么了佃却?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵薄榛,是天一觀的道長讳窟。 經(jīng)常有香客問我,道長敞恋,這世上最難降的妖魔是什么丽啡? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮硬猫,結(jié)果婚禮上补箍,老公的妹妹穿的比我還像新娘改执。我一直安慰自己,他們只是感情好坑雅,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布辈挂。 她就那樣靜靜地躺著,像睡著了一般霞丧。 火紅的嫁衣襯著肌膚如雪呢岗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天蛹尝,我揣著相機與錄音后豫,去河邊找鬼。 笑死突那,一個胖子當(dāng)著我的面吹牛挫酿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愕难,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼早龟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猫缭?” 一聲冷哼從身側(cè)響起葱弟,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猜丹,沒想到半個月后芝加,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡射窒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年藏杖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脉顿。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝌麸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艾疟,到底是詐尸還是另有隱情来吩,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布蔽莱,位于F島的核電站误褪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碾褂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一历葛、第九天 我趴在偏房一處隱蔽的房頂上張望正塌。 院中可真熱鬧嘀略,春花似錦、人聲如沸乓诽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸠天。三九已至讼育,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稠集,已是汗流浹背奶段。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剥纷,地道東北人痹籍。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像晦鞋,于是被迫代替她去往敵國和親蹲缠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,111評論 1 32
  • 在校招題解的算法篇中悠垛,還整理了部分《劍指offer》原題线定,這里均用Java實現(xiàn)。 校招面試題解 劍指offer題解...
    厘米姑娘閱讀 22,094評論 18 153
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系确买,并對這種結(jié)構(gòu)定義相應(yīng)的運算斤讥,而且確保經(jīng)過這...
    Winterfell_Z閱讀 5,854評論 0 13
  • 我一直覺的自己的人生不該如此平凡周偎,淡而無味,激不起一層浪撑帖,或是自己的不努力吧蓉坎,亦或是對于生活我太過寬容自己,總以為...
    雪景球閱讀 168評論 0 1
  • 一定要和喜歡的人在一起么勿侯?未必! 小魚缴罗,是我的同學(xué)助琐,她為人比較單純,性格也比較內(nèi)斂面氓,不怎么愛說話兵钮,當(dāng)班級里面在說誰...
    追覓陽光閱讀 379評論 0 0