1. 字符串反转
void char_reverse(char *cha) {
if (strlen(cha) ==0 ) return;
char *begin = cha;
char *end = cha + strlen(cha) -1;
while (begin <end) {
char temp = *begin;
*(begin++) = *end;
*(end--) = temp;
}
}
2. 有序数组合并
[ 1 4 6 7 9] [2 3 5 6 ]
双指针法实现
void mergeList(int a[], int aLen ,int b[], int bLen, int result[]) {
int p =0;
int q =0;
int i =0;
while (p< aLen && q< bLen) {
if (a[p]<= b[q]) {
result[i++] = a[p++];
} else {
result[i++] = b[q++];
}
}
// 追加剩余元素
// 追加b
while (q<bLen) {
result[i++] = b[q++];
}
// 追加a
while (p<bLen) {
result[i++] = a[p++];
}
}
3. 查找两个子视图的公共父视图
两个链表的公共的共同父节点, 从跟上都是一样的 倒序遍历判断即可
-(NSArray <UIView *>*)findSuperViews:(UIView *)view {
NSMutableArray * result = [NSMutableArray array];
UIView * temp = view.superview;
while (temp) {
[result addObject:temp];
temp = temp.superview;
}
return result;
}
- (NSArray <UIView *> *)findCommonSuperView:(UIView *)view other:(UIView *)viewOther {
NSMutableArray *result = [NSMutableArray array];
//查找第一个视图的所有父视图
NSArray *arrayOne = [self findSuperViews:view];
//查找第二个视图的所有父视图
NSArray *arrayTwo = [self findSuperViews:viewOther];
// 倒序遍历查找所有公共父视图
int i = 0;
// 越界条件判断
while (i< MIN(arrayOne.count, arrayTwo.count) ) {
// 倒叙获取父视图
UIView *superOne = arrayOne[arrayOne.count - i -1];
UIView *superTwo = arrayTwo[arrayTwo.count - i -1];
if (superOne == superTwo) {
[result addObject:superOne];
i++;
}else {
break;
}
}
return result;
}
4. 求无序数组当中的中位数
- 排序算法 + 中位数
- 利用快排机制(分治思想) 选取关键字,高低交换扫描
- 任意挑选一个元素,以该元素为指点,划分集合为两部分
- 如果左侧集合长度恰为(n-1)/2 ,那么支点恰为中位数
- 如果左侧长度<(n-1)/2,那么中位点在右侧,反之,中位数在左侧。
- 继续进入相应的一侧继续寻找中位点
int findMiedian(int a[], int aLen) {
if (aLen <1) {
return 0;
}
int low =0;
int high = aLen -1;
int mid = (aLen -1)/2; // 3个元素 中位数 a[(3-1)/2] 4个元素 中位数 a[(4-1)/2]
int div = partSort(a, low, high);
while (div != mid) {
// 中位数偏左,左侧区域查找
if (mid<div) {
div = partSort(a, 0, div-1);
} else {
div = partSort(a, div+1, high);
}
}
// 找到了
return a[mid];
}
int partSort(int a[], int start, int end) {
int low = start;
int high = end;
// 选取关键字
int key = a[end];
while (low <high) {
// 找到关键字 左侧找出第一个大于 右侧找出第一个小于 两个数字进行交换
// 左侧 出第一个大于
while (low<high && a[low] <= key) {
low++;
}
// 左侧 出第一个小于
while (low<high && a[high] >= key) {
high--;
}
// 交换
if (low <high) {
int temp = a[low];
a[low] = a[high];
a[high] = temp;
}
}
// high 和 end 互换
int temp = a[high];
a[high] = a[end];
a[end] = temp;
return low;
}