算法 二叉樹 單向鏈表\雙向鏈表\循環(huán)鏈表

數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)
數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)一般常
用的有兩種 順序存儲(chǔ)結(jié)構(gòu) 和 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
? 2.1 順序存儲(chǔ)結(jié)構(gòu)

發(fā)揮想象力啊。 舉個(gè)列子。數(shù)組妹萨。1-2-3-4-5-6-7-8-9-10。這個(gè)就是一個(gè)順序存儲(chǔ)結(jié)構(gòu) ,存儲(chǔ)是按順序的 舉 例說明啊套才。 棧。做開發(fā)的都熟悉慕淡。棧是先進(jìn)后出 背伴,后進(jìn)先出的形式 對(duì)不對(duì) ?!他的你可以這樣理解
hello world 在棧里面從棧底到棧頂?shù)倪壿嬕来螢?h-e-l-l-o-w-o-r-l-d 這就是順序存儲(chǔ) 再比如 隊(duì)列 ,隊(duì)列 是先進(jìn)先出的對(duì)吧峰髓,從頭到尾 h-e-l-l-o-w-o-r-l-d 就是這樣排對(duì)的
? 2.2 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

再次發(fā)揮想象力 這個(gè)稍微復(fù)雜一點(diǎn) 這個(gè)圖片我一直弄好 傻寂,回頭找美工問問,再貼上 例如 還是一個(gè)數(shù)組
1-2-3-4-5-6-7-8-9-10 鏈?zhǔn)酱鎯?chǔ)就不一樣了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地 址)-6(地址)-10(地址)携兵。每個(gè)數(shù)字后面跟著一個(gè)地址 而且存儲(chǔ)形式不再是順序 疾掰,也就說順序亂了,1(地址) 1 后面跟著的這個(gè)地址指向的是 2眉孩,2 后面的地址指向的是 3个绍,3 后面的地址指向是誰你應(yīng)該清楚了吧。他 執(zhí)行的時(shí)候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址)浪汪,但是存儲(chǔ) 的時(shí)候就是完全隨機(jī)的巴柿。明白了?!

單向鏈表\雙向鏈表\循環(huán)鏈表
還是舉例子。理解最重要死遭。不要去死記硬背 哪些什么广恢。定義啊。邏輯啊呀潭。理解才是最重要滴

3.1 單向鏈表
A->B->C->D->E->F->G->H. 這就是單向鏈表 H 是頭 A 是尾 像一個(gè)只有一個(gè)頭的火車一樣 只能一個(gè)頭拉
著跑

3.2 雙向鏈表

數(shù)組和鏈表區(qū)別:
數(shù)組:數(shù)組元素在內(nèi)存上連續(xù)存放钉迷,可以通過下標(biāo)查找元素;插入、刪除需要移動(dòng)大量元素钠署,比較適用元
素很少變化的情況
鏈表:鏈表中的元素在內(nèi)存中不是順序存儲(chǔ)的糠聪,查找慢,插入谐鼎、刪除只需要對(duì)元素指針重新賦值舰蟆,效率高

3.3 循環(huán)鏈表
循環(huán)鏈表是與單向鏈表一樣,是一種鏈?zhǔn)降拇鎯?chǔ)結(jié)構(gòu),所不同的是身害,循環(huán)鏈表的最后一個(gè)結(jié)點(diǎn)的指針是指 向該循環(huán)鏈表的第一個(gè)結(jié)點(diǎn)或者表頭結(jié)點(diǎn)味悄,從而構(gòu)成一個(gè)環(huán)形的鏈。發(fā)揮想象力 A->B->C->D->E->F->G->H->A. 繞成一個(gè)圈塌鸯。就像蛇吃自己的這就是循環(huán) 不需要去死記硬背哪些理論知識(shí)侍瑟。

4.1 什么是二叉樹
樹形結(jié)構(gòu)下,兩個(gè)節(jié)點(diǎn)以內(nèi) 都稱之為二叉樹 不存在大于 2 的節(jié)點(diǎn) 分為左子樹 右子樹 有順序 不能顛 倒 ,懵逼了吧丙猬,你肯定會(huì)想這是什么玩意涨颜,什么左子樹右子樹 ,都什么跟什么鬼? 現(xiàn)在我以普通話再講 一遍淮悼,你把二叉樹看成一個(gè)人 咐低,人的頭呢就是樹的根 ,左子樹就是左手袜腥,右子樹就是右手见擦,左右手可以 都沒有(殘疾嘛呀邢,聲明一下曙蒸,絕非歧視殘疾朋友,勿怪列粪,勿怪就是舉個(gè)例子福侈,i am very sorry) , 左右 手呢可以有一個(gè)酒来,就是不能顛倒。這樣講應(yīng)該明白了吧

二叉樹有五種表現(xiàn)形式
1.空的樹(沒有節(jié)點(diǎn))可以理解為什么都沒 像空氣一樣
2.只有根節(jié)點(diǎn)肪凛。 (理解一個(gè)人只有一個(gè)頭 其他的什么都沒堰汉,說的有點(diǎn)恐怖) 3.只有左子樹 (一個(gè)頭 一個(gè)左手 感覺越來越寫不下去了)
4.只有右子樹
5.左右子樹都有
二叉樹可以轉(zhuǎn)換成森林 樹也可以轉(zhuǎn)換成二叉樹。這里就不介紹了 你做項(xiàng)目絕對(duì)用不到 數(shù)據(jù)結(jié)構(gòu)大致介紹這么多吧伟墙。理解為主, 別死記翘鸭,死記沒什么用

1、不用中間變量,用兩種方法交換 A 和 B 的值

1001.png

2戳葵、求最大公約數(shù)


1002.png

3就乓、模擬棧操作
? 棧是一種數(shù)據(jù)結(jié)構(gòu),特點(diǎn):先進(jìn)后出 -
? 練習(xí):使用全局變量模擬棧的操作

include <stdio.h> #include <stdbool.h> #include <assert.h>

//保護(hù)全局變量:在全局變量前加 static 后拱烁,這個(gè)全局變量就只能在本文件中使用 static int data[1024];//棧最多能保存 1024 個(gè)數(shù)據(jù)
static int count = 0;//目前已經(jīng)放了多少個(gè)數(shù)(相當(dāng)于棧頂位置)


1003.png

4生蚁、排序算法
選擇排序、冒泡排序戏自、插入排序三種排序算法可以總結(jié)為如下:
都將數(shù)組分為已排序部分和未排序部分邦投。
1.選擇排序?qū)⒁雅判虿糠侄x在左端,然后選擇未排序部分的最小元素和未排序部分的第一個(gè)元素交換擅笔。 2.冒泡排序?qū)⒁雅判虿糠侄x在右端尼摹,在遍歷未排序部分的過程執(zhí)行交換见芹,將最大元素交換到最右端。 3.插入排序?qū)⒁雅判虿糠侄x在左端蠢涝,將未排序部分元的第一個(gè)元素插入到已排序部分合適的位置。 4.1阅懦、選擇排序
? 【選擇排序】:最值出現(xiàn)在起始端
? 第1趟:在n個(gè)數(shù)中找到最小(大)數(shù)與第一個(gè)數(shù)交換位置
? 第2趟:在剩下n-1個(gè)數(shù)中找到最小(大)數(shù)與第二個(gè)數(shù)交換位置 ? 重復(fù)這樣的操作...依次與第三個(gè)和二、第四個(gè)...數(shù)交換位置
? 第n-1趟,最終可實(shí)現(xiàn)數(shù)據(jù)的升序(降序)排列耳胎。

/**
 選擇排序
 */
void xuanzePaixu() {
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"17",@"29",@"35",@"14",@"40", nil];
    for (int i = 0; i < arr.count - 1; i++) {
        for (int j = i + 1; j < arr.count; j++) {
            if ([arr[i] intValue] > [arr[j] intValue]) {
                int temp = [arr[j] intValue];
                arr[j] = arr[i];
                arr[i] = [NSString stringWithFormat:@"%d",temp];
            }
        }
    }
     NSLog(@"%@",arr);
}

4.2惯吕、冒泡排序
? 【冒泡排序】:相鄰元素兩兩比較,比較完一趟怕午,最值出現(xiàn)在末尾
? 第1趟:依次比較相鄰的兩個(gè)數(shù)废登,不斷交換(小數(shù)放前,大數(shù)放后)逐個(gè)推進(jìn)郁惜,最值最后出現(xiàn)在第n
個(gè)元素位置
? 第2趟:依次比較相鄰的兩個(gè)數(shù)堡距,不斷交換(小數(shù)放前,大數(shù)放后)逐個(gè)推進(jìn)兆蕉,最值最后出現(xiàn)在第n-1
個(gè)元素位置
? ............
? 第n-1趟:依次比較相鄰的兩個(gè)數(shù)羽戒,不斷交換(小數(shù)放前,大數(shù)放后)逐個(gè)推進(jìn)虎韵,最值最后出現(xiàn)在第
2 個(gè)元素位置

/**
 冒泡排序
 */
void maoPaoPaixu(void) {
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"17",@"29",@"35",@"14",@"40", nil];
    for (int i = 0; i < arr.count; i++) {
        for (int j = 0; j < arr.count - 1 - i; j++) {
            if ([arr[j] intValue] > [arr[j+1] intValue]) {
                int temp = [arr[j] intValue];
                arr[j] = arr[j + 1];
                arr[j+ 1] = [NSString stringWithFormat:@"%d",temp];
            }
        }
    }
    
    NSLog(@"%@",arr);
}

5易稠、折半查找(二分查找)
折半查找:優(yōu)化查找時(shí)間(不用遍歷全部數(shù)據(jù))
折半查找的原理:
? 1> 數(shù)組必須是有序的
? 2> 必須已知 min 和 max(知道范圍)
? 3> 動(dòng)態(tài)計(jì)算 mid 的值,取出 mid 對(duì)應(yīng)的值進(jìn)行比較
? 4> 如果 mid 對(duì)應(yīng)的值大于要查找的值包蓝,那么 max 要變小為 mid-1
? 5> 如果 mid 對(duì)應(yīng)的值小于要查找的值驶社,那么 min 要變大為 mid+1
// 已知一個(gè)有序數(shù)組, 和一個(gè) key, 要求從數(shù)組中找到 key 對(duì)應(yīng)的索引位置

/**
 二分查找

 @param ary
 @param findNum
 @return
 */
NSInteger efChazhao(NSArray *ary,NSInteger findNum) {
    NSInteger mid = (ary.count - 1) / 2.0;
    if (mid == 0) {
        return -1; //找不到
    }
    if (findNum == [ary[mid] integerValue]) {
        return mid;//返回所在的序列號(hào)
    }
    else if(findNum > [ary[mid] integerValue]) {
        return efChazhao([ary subarrayWithRange:NSMakeRange(mid + 1, ary.count - mid - 1)], findNum);
    }
    else {
        return efChazhao([ary subarrayWithRange:NSMakeRange(0, mid + 1)], findNum);
    }
}
void erfenChazhao() {
    //二分查找一定是有序的數(shù)組
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"17",@"29",@"35",@"14",@"40", nil];
    NSInteger mid = efChazhao(arr,15);
    NSLog(@"%ld",(long)mid);
}



/**
 快速排序
 */
void ksPaixu(NSMutableArray *arr,NSInteger left,NSInteger right) {
    if(left == right) return;
    NSInteger i = left;
    NSInteger j = right;
    NSInteger key = [arr[left] integerValue];
    while (i < j) {
        while (i < j && key <= [arr[j] integerValue]) {
            j--;
        }
        arr[i] = arr[j];
        while (i<j && key >= [arr[i] integerValue]) {
            I++;
        }
        arr[j] = arr[i];
    }
    arr[i] = [NSString stringWithFormat:@"%ld",(long)key];
    ksPaixu(arr, left, i-1);
    ksPaixu(arr, i+1, right);
}
void kuaisuPaixu() {
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"17",@"29",@"35",@"14",@"40", nil];
    ksPaixu(arr, 0, arr.count-1);
    NSLog(@"%@",arr);
}



/**
 插入排序
 */
void charuPaixu() {
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"17",@"29",@"35",@"14",@"40", nil];
    for (int i = 1; i<arr.count; i++) {
        int j = I;
        NSInteger temp = [arr[i] integerValue];
        while (j > 0 && temp < [arr[j-1] integerValue]) {
            [arr replaceObjectAtIndex:j withObject:arr[j-1]];
            j--;
        }
        [arr replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@"%ld",(long)temp]];
    }
    NSLog(@"%@",arr);
}


/**
 希爾排序
 */
void xierPaixu() {
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"17",@"29",@"35",@"14",@"40", nil];
    int gap = arr.count / 2.0;
    while (gap >= 1) {
        for (int i = gap; i < arr.count; i++) {
            NSInteger temp = [arr[i] integerValue];
            int j = I;
            while (j >= gap && temp < [arr[j- gap] integerValue]) {
                [arr replaceObjectAtIndex:j withObject:arr[j-gap]];
                j-=gap;
            }
            [arr replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@"%ld",(long)temp]];
        }
        gap = gap / 2.0;
    }
    NSLog(@"%@",arr);
}

字符串反正
給定字符串 "hello,world",實(shí)現(xiàn)將其反轉(zhuǎn)。輸出結(jié)果:dlrow,olleh

- (NSString *)reversalString:(NSString *)originString{
    NSString *resultStr = @"";
    for (NSInteger i = originString.length -1; i >= 0; i--) {
      NSString *indexStr = [originString substringWithRange:NSMakeRange(i, 1)];
      resultStr = [resultStr stringByAppendingString:indexStr];
    }
  return resultStr;
}

void char_reverse(char *cha){
  char *begin = cha;
  char *end = cha + strlen(cha) - 1;
  while (begin <= end) {
    char temp = *end;
    *(end--) = *begin;
    *(begin++) = temp;
  }
}
// 調(diào)用
  char cha[] = "hello,world";
  char_reverse(cha);
  printf("%s",cha);
  結(jié)果:dlrow,olleh

序數(shù)組合并
將有序數(shù)組 {1,4,6,7,9} 和 {2,3,5,6,8,9,10,11,12} 合并為 {1,2,3,4,5,6,6,7,8,9,9,10,11,12}

2001.png
// 將有序數(shù)組a和b的值合并到一個(gè)數(shù)組result當(dāng)中测萎,且仍然保持有序
void mergeList(int a[], int aLen, int b[], int bLen, int result[]);


void mergeList(int a[], int aLen, int b[], int bLen, int result[])
{
    int p = 0; // 遍歷數(shù)組a的指針
    int q = 0; // 遍歷數(shù)組b的指針
    int i = 0; // 記錄當(dāng)前存儲(chǔ)位置
    
    // 任一數(shù)組沒有到達(dá)邊界則進(jìn)行遍歷
    while (p < aLen && q < bLen) {
        // 如果a數(shù)組對(duì)應(yīng)位置的值小于b數(shù)組對(duì)應(yīng)位置的值
        if (a[p] <= b[q]) {
            // 存儲(chǔ)a數(shù)組的值
            result[i] = a[p];
            // 移動(dòng)a數(shù)組的遍歷指針
            p++;
        }
        else{
            // 存儲(chǔ)b數(shù)組的值
            result[i] = b[q];
            // 移動(dòng)b數(shù)組的遍歷指針
            q++;
        }
        // 指向合并結(jié)果的下一個(gè)存儲(chǔ)位置
        i++;
    }
    
    // 如果a數(shù)組有剩余
    while (p < aLen) {
        // 將a數(shù)組剩余部分拼接到合并結(jié)果的后面
        result[i] = a[p++];
        i++;
    }
    
    // 如果b數(shù)組有剩余
    while (q < bLen) {
        // 將b數(shù)組剩余部分拼接到合并結(jié)果的后面
        result[i] = b[q++];
        i++;
    }
}

HASH 算法
? 哈希表
例:給定值是字母 a亡电,對(duì)應(yīng) ASCII 碼值是 97,數(shù)組索引下標(biāo)為 97绳泉。
這里的 ASCII 碼逊抡,就算是一種哈希函數(shù),存儲(chǔ)和查找都通過該函數(shù)零酪,有效地提高查找效率冒嫡。
? 在一個(gè)字符串中找到第一個(gè)只出現(xiàn)一次的字符。如輸入"abaccdeff"四苇,輸出'b'字符(char)是一個(gè)長度為8 的數(shù)據(jù)類型孝凌,因此總共有 256 種可能。每個(gè)字母根據(jù)其 ASCII 碼值作為數(shù)組下標(biāo)對(duì)應(yīng)數(shù)組種的一個(gè)數(shù) 字月腋。數(shù)組中存儲(chǔ)的是每個(gè)字符出現(xiàn)的次數(shù)蟀架。

2002.png

查找兩個(gè)子視圖的共同父視圖 思路:分別記錄兩個(gè)子視圖的所有父視圖并保存到數(shù)組中瓣赂,然后倒序?qū)ふ?直至找到第一個(gè)不一樣的父視圖。

2003.png
// 查找兩個(gè)視圖的共同父視圖
- (NSArray<UIView *> *)findCommonSuperView:(UIView *)view other:(UIView *)viewOther;

- (NSArray <UIView *> *)findCommonSuperView:(UIView *)viewOne other:(UIView *)viewOther
{
    NSMutableArray *result = [NSMutableArray array];
    
    // 查找第一個(gè)視圖的所有父視圖
    NSArray *arrayOne = [self findSuperViews:viewOne];
    // 查找第二個(gè)視圖的所有父視圖
    NSArray *arrayOther = [self findSuperViews:viewOther];
    
    int i = 0;
    // 越界限制條件
    while (i < MIN((int)arrayOne.count, (int)arrayOther.count)) {
        // 倒序方式獲取各個(gè)視圖的父視圖
        UIView *superOne = [arrayOne objectAtIndex:arrayOne.count - i - 1];
        UIView *superOther = [arrayOther objectAtIndex:arrayOther.count - i - 1];
        
        // 比較如果相等 則為共同父視圖
        if (superOne == superOther) {
            [result addObject:superOne];
            i++;
        }
        // 如果不相等片拍,則結(jié)束遍歷
        else{
            break;
        }
    }
    
    return result;
}

- (NSArray <UIView *> *)findSuperViews:(UIView *)view
{
    // 初始化為第一父視圖
    UIView *temp = view.superview;
    // 保存結(jié)果的數(shù)組
    NSMutableArray *result = [NSMutableArray array];
    while (temp) {
        [result addObject:temp];
        // 順著superview指針一直向上查找
        temp = temp.superview;
    }
    return result;
}






- (void)viewDidLoad {
    [super viewDidLoad];
    Class commonClass1 = [self commonClass1:[ViewA class] andClass:[ViewC
class]];
    NSLog(@"%@",commonClass1);
    //      2018-03-22 17:36:01.868966+0800[84288:2458900] ViewD
}
//獲取所有父類
- (NSArray *)superClasses:(Class)class {
    if (class == nil) {
        return @[];
    }
    NSMutableArray *result = [NSMutableArray array];
    while (class != nil) {
        [result addObject:class];
        class = [class superclass];
    }
    return [result copy];
}
- (Class)commonClass1:(Class)classA andClass:(Class)classB {
    NSArray *arr1 = [self superClasses:classA];
    NSArray *arr2 = [self superClasses:classB];
    for (NSUInteger i = 0; i < arr1.count; ++i) {
        Class targetClass = arr1[i];
        for (NSUInteger j = 0; j < arr2.count; ++j) {
            if (targetClass == arr2[j]) {
                return targetClass;
} }
}
return nil; 
}

- (Class)commonClass2:(Class)classA andClass:(Class)classB{
    NSArray *arr1 = [self superClasses:classA];
    NSArray *arr2 = [self superClasses:classB];
    NSSet *set = [NSSet setWithArray:arr2];
    for (NSUInteger i =0; i<arr1.count; ++i) {
        Class targetClass = arr1[i];
        if ([set containsObject:targetClass]) {
            return targetClass;
        }
}
return nil; 
}






/**
 求無序數(shù)組當(dāng)中的中位數(shù)(快排思想煌集,選中關(guān)鍵字,高低交替掃描)
 示例:
[@"1",@"9",@"6",@"8",@"3",@"2"]
 輸出:
@"3"
 */

+ (void)findMedianValue {undefined

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"9",@"6",@"8",@"3",@"2", nil];

    NSLog(@"輸入數(shù)據(jù):%@",array);

    NSInteger low = 0;

    NSInteger high = array.count - 1;

    

    NSInteger mid = high/2;

    NSInteger result = [self arraySort:array IndexStart:low IndexEnd:high];

    while(result != mid) {undefined

        if (result < mid) {undefined

            result = [self arraySort:array IndexStart:result+1 IndexEnd:high];

        }else {undefined

            result = [self arraySort:array IndexStart:low IndexEnd:result-1];

        }

    }

    NSLog(@"中位數(shù)是:%@",array[mid]);

}

 

+ (NSInteger)arraySort:(NSMutableArray *)array IndexStart:(NSInteger)indexStart IndexEnd:(NSInteger)indexEnd {undefined

    

    NSInteger keyValue = [array[indexEnd] integerValue];

    NSInteger lastEnd = indexEnd;

    

    while (indexStart < indexEnd) {undefined

        while (indexStart < indexEnd && [array[indexStart] integerValue] <= keyValue) {undefined

            indexStart++;

        }

        while (indexStart < indexEnd && [array[indexEnd] integerValue] >= keyValue) {undefined

            indexEnd--;

        }

        if (indexStart < indexEnd) {undefined

            NSString *temp = array[indexStart];

            array[indexStart] = array[indexEnd];

            array[indexEnd] = temp;

        }

    }

    NSString *temp = array[indexEnd];

    array[indexEnd] = array[lastEnd];

    array[lastEnd] = temp;

    return indexStart;    

}


//給定一個(gè)整數(shù)數(shù)組和一個(gè)目標(biāo)值捌省,找出數(shù)組中和為目標(biāo)值得的倆個(gè)數(shù)
//給定nums = [2,7,11,15]  ,target = 9 -------返回【0苫纤,1】

 ● 第一層for循環(huán)從索引0到倒數(shù)第二個(gè)索引拿到每個(gè)數(shù)組的元素
 ●第二個(gè)for循環(huán)遍歷上一層for循環(huán)拿到的元素的后面得所有元素
class Solution {
    public int[] twoSum(int[] nums, int target) {
       int len = nums.length;
        int[] result = new int[2];
        for(int i = 0; i < len; i++){
            for(int j = i+1; j < len; j++){
                if(nums[i] + nums[j] == target){
                    result[0] = i;
                    result[1] = j;
                    return result;
} }
}
        return result;
    }
}

//查找第一個(gè)只出現(xiàn)一次的字符(hash查找)
# define SIZE 256
char GetChar(char str[])
{
  if(!str)
    return 0;
  char* p = NULL;
  unsigned count[SIZE] = {0};
  char buffer[SIZE];
  char* q = buffer;
  for(p=str; *p!=0; p++)
  {
    if(++count[(unsigned char)*p] == 1)
      *q++ = *p;
}
  for (p=buffer; p<q; p++)
  {
    if(count[(unsigned char)*p] == 1)
    return *p;
  }
  return 0; 
}

char findFirstChar(char* cha)
{
    char result = '\0';
    // 定義一個(gè)數(shù)組 用來存儲(chǔ)各個(gè)字母出現(xiàn)次數(shù)
    int array[256];
    // 對(duì)數(shù)組進(jìn)行初始化操作
    for (int i=0; i<256; i++) {
        array[i] =0;
    }
    // 定義一個(gè)指針 指向當(dāng)前字符串頭部
    char* p = cha;
    // 遍歷每個(gè)字符
    while (*p != '\0') {
        // 在字母對(duì)應(yīng)存儲(chǔ)位置 進(jìn)行出現(xiàn)次數(shù)+1操作
        array[*(p++)]++;
    }
    
    // 將P指針重新指向字符串頭部
    p = cha;
    // 遍歷每個(gè)字母的出現(xiàn)次數(shù)
    while (*p != '\0') {
        // 遇到第一個(gè)出現(xiàn)次數(shù)為1的字符,打印結(jié)果
        if (array[*p] == 1)
        {
            result = *p;
            break;
        }
        // 反之繼續(xù)向后遍歷
        p++;
    }
    
    return result;
}


// 無序數(shù)組查找中位數(shù)
    int list[10] = {12,3,10,8,6,7,11,13,9};
    // 3 6 7 8 9 10 11 12 13
    //         ^
    int median = findMedian(list, 10);
    printf("the median is %d \n", median);


//求一個(gè)無序數(shù)組的中位數(shù)
int findMedian(int a[], int aLen)
{
    int low = 0;
    int high = aLen - 1;
    
    int mid = (aLen - 1) / 2;
    int div = PartSort(a, low, high);
    
    while (div != mid)
    {
        if (mid < div)
        {
            //左半?yún)^(qū)間找
            div = PartSort(a, low, div - 1);
        }
        else
        {
            //右半?yún)^(qū)間找
            div = PartSort(a, div + 1, high);
        }
    }
    //找到了
    return a[mid];
}

int PartSort(int a[], int start, int end)
{
    int low = start;
    int high = end;
    
    //選取關(guān)鍵字
    int key = a[end];
    
    while (low < high)
    {
        //左邊找比key大的值
        while (low < high && a[low] <= key)
        {
            ++low;
        }
        
        //右邊找比key小的值
        while (low < high && a[high] >= key)
        {
            --high;
        }
        
        if (low < high)
        {
            //找到之后交換左右的值
            int temp = a[low];
            a[low] = a[high];
            a[high] = temp;
        }
    }
    
    int temp = a[high];
    a[high] = a[end];
    a[end] = temp;
    
    return low;
}


定義一個(gè)鏈表

// 定義一個(gè)鏈表
struct Node {
    int data;
    struct Node *next;
};

@interface ReverseList : NSObject
// 鏈表反轉(zhuǎn)
struct Node* reverseList(struct Node *head);
// 構(gòu)造一個(gè)鏈表
struct Node* constructList(void);
// 打印鏈表中的數(shù)據(jù)
void printList(struct Node *head);

@end

#import "ReverseList.h"

@implementation ReverseList

struct Node* reverseList(struct Node *head)
{
    // 定義遍歷指針纲缓,初始化為頭結(jié)點(diǎn)
    struct Node *p = head;
    // 反轉(zhuǎn)后的鏈表頭部
    struct Node *newH = NULL;
    
    // 遍歷鏈表
    while (p != NULL) {
        
        // 記錄下一個(gè)結(jié)點(diǎn)
        struct Node *temp = p->next;
        // 當(dāng)前結(jié)點(diǎn)的next指向新鏈表頭部
        p->next = newH;
        // 更改新鏈表頭部為當(dāng)前結(jié)點(diǎn)
        newH = p;
        // 移動(dòng)p指針
        p = temp;
    }
    
    // 返回反轉(zhuǎn)后的鏈表頭結(jié)點(diǎn)
    return newH;
}

struct Node* constructList(void)
{
    // 頭結(jié)點(diǎn)定義
    struct Node *head = NULL;
    // 記錄當(dāng)前尾結(jié)點(diǎn)
    struct Node *cur = NULL;
    
    for (int i = 1; i < 5; i++) {
        struct Node *node = malloc(sizeof(struct Node));
        node->data = i;
        
        // 頭結(jié)點(diǎn)為空卷拘,新結(jié)點(diǎn)即為頭結(jié)點(diǎn)
        if (head == NULL) {
            head = node;
        }
        // 當(dāng)前結(jié)點(diǎn)的next為新結(jié)點(diǎn)
        else{
            cur->next = node;
        }
        
        // 設(shè)置當(dāng)前結(jié)點(diǎn)為新結(jié)點(diǎn)
        cur = node;
    }
    
    return head;
}

void printList(struct Node *head)
{
    struct Node* temp = head;
    while (temp != NULL) {
        printf("node is %d \n", temp->data);
        temp = temp->next;
    }
}

@end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祝高,隨后出現(xiàn)的幾起案子栗弟,更是在濱河造成了極大的恐慌,老刑警劉巖工闺,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乍赫,死亡現(xiàn)場離奇詭異,居然都是意外死亡斤寂,警方通過查閱死者的電腦和手機(jī)耿焊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遍搞,“玉大人罗侯,你說我怎么就攤上這事∠常” “怎么了钩杰?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诊县。 經(jīng)常有香客問我讲弄,道長,這世上最難降的妖魔是什么依痊? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任避除,我火速辦了婚禮,結(jié)果婚禮上胸嘁,老公的妹妹穿的比我還像新娘瓶摆。我一直安慰自己,他們只是感情好性宏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布群井。 她就那樣靜靜地躺著,像睡著了一般毫胜。 火紅的嫁衣襯著肌膚如雪书斜。 梳的紋絲不亂的頭發(fā)上诬辈,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音荐吉,去河邊找鬼焙糟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛样屠,可吹牛的內(nèi)容都是我干的酬荞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瞧哟,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了枪向?” 一聲冷哼從身側(cè)響起勤揩,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秘蛔,沒想到半個(gè)月后陨亡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡深员,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年负蠕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倦畅。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遮糖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叠赐,到底是詐尸還是另有隱情欲账,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布芭概,位于F島的核電站赛不,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏罢洲。R本人自食惡果不足惜踢故,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惹苗。 院中可真熱鬧殿较,春花似錦、人聲如沸鸽粉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽触机。三九已至帚戳,卻和暖如春玷或,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背片任。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工偏友, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人对供。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓位他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親产场。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹅髓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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