1.将一个数组的所有奇数位放在所有的偶数位之前
(1)代码思路:
设置两个指针,一个指向数组的首元素,一个指向数组的尾元素,先判断首元素,如果该元素是奇数,那么指针+1指向数组的下一个元素,如果是偶数那这个指针不变,开始判断尾指针,如果尾指针指向的是偶数,那么尾指针-1,指向它的前一个元素,如果尾指针指向的是一个奇数,那么尾指针不变,在首指针小于尾指针的情况下,交换首尾指针指向的元素,然后循环上述操作,直到尾指针小于等于首指针时停止。
#include<stdio.h> #include<stdlib.h> void Judge(int *p, int *q) { int tmp = *q; *q = *p; *p = tmp; } void X(int arr[], int sz) { int *left = &arr[0]; int *right = &arr[sz]; while(left < right) { while(((*left) % 2 != 0)&& (left < right)) { left++; } while(((*right) % 2 == 0) && (left < right)) { right--; } Judge(left,right); } } int main() { int a[] = {0}; int n = 0; int i = 0; scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%d", &a[i]); } X(a, n-1); for(i = 0; i < n; i++) { printf("%d", a[i]); } system("pause"); return 0; }
2.在杨氏矩阵中找一个数字,并且时间复杂度小于0(n)
(1)代码思路
用待查找元素与二维数组右对角线上的元素右依次比较,如果大于则与它这列下一行的数字比较,如果小于则在他所在行中,向前比较,就这依次寻找如果找到直接返回1,如果直到行数大于等于二维数组的行数或列数小于零则代表找不到。
#include<stdio.h> #include<stdlib.h> int Find(int arr[4][4],int *p, int *q, int x) { *p = 0; *q = 3; do { if(arr[*p][*q] < x) { (*p)++; //*p要加括号,因为*和++的优先级相同,如果不加()的话会从右向左运算 } else if(arr[*p][*q] > x) { (*q)--; } else { return 1; } }while((*p < 4)&&(*q >= 0)); return 0; } int main() { int a[4][4] = {{1,2 ,3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13,14,15,16}}; int row = 0; int col = 3; int n = 0; int ret = 0; printf("请输入你要查找的数字\n"); scanf("%d", &n); ret = Find(a,&row, &col, n);// if(ret == 1) { printf("存在,行为%d,列为%d\n", row+1, col+1); } else { printf("不存在"); } system("pause"); return 0; }