1.调整数组使奇数全部都位于偶数前面。
题目:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
void reverse_array(int a[],int n){
//数组的两头分别向中间检索
int left = 0;
int right = n - 1;
while(left<right){
//从左开始查找数是偶数的
while(left < right && (a[left] % 2) != 0){
left++;
}
//从右开始查找是奇数的
while(right < left && (a[right] % 2) == 0){
right++;
}
while(left < right){
a[left] = a[left] ^ a[right];
a[right] = a[left] ^ a[right];
a[left] = a[left] ^ a[right];
//利用异或的方式进行交换数
}
}
}
2.杨氏矩阵有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在.
时间复杂度小于O(N); 数组:
1 2 3 / 1 3 4 / 1 2 3
2 3 4 / 2 4 5 / 4 5 6
3 4 5 / 4 5 6 / 7 8 9
//从右上角开始搜索
//key > a[i][j] --> 向左搜索
//key < a[i][j] --> 向下搜索
//从左下角开始搜索
//key < a[i][j] --> 向右搜索
//key > a[i][j] --> 向上搜索
int main(){
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int n;
int px, py;
scanf("%d", &n);
if (find(a, 3, 3, n, &px, &py)){
printf("%d,%d", px, py);
}
else{
return 0;
}
}
void find(int a[3][3],int row,int col,int key,int *px,int *py){
//从右上角开始搜索
int x = 0;
int y = col - 1;
//左下角搜索结束
//x >= row;y < 0;
while(x < row && y >= 0){
if(a[x][y] == key){
*px = x;
*py = y;
return 1;
}
else if(a[x][y] > key){
//向左搜索
y--;
}
else{
x++;
}
}
*px = -1;
*py = -1;
return 0;
//如果都没有搜索到,就将其赋予一个不存在的值,直接返回0;
}
void find_r(int a[3][3],int row,int col,int x,int y,int key,int *px,int *py){
//从左下角开始搜索,利用递归的写法
//因为是递归循环,所以没有循环,我们需要记住此时是在哪个位置
//所以我们定义了参数x,y
if(x < 0 || y > col){
return 0;
}
if(key > a[x][y]){
return find_r(a, row, col, x, y + 1, key, px, py);
}
else if(key < a[x][y]){
return find_r(a, row, col, x - 1, y, key, px, py);
}
else if(key == a[x][y]){
*px = x;
*py = y;
return 1;
}
}
初阶C已结束!接下来就是进阶了!加油!一定要完成自我的进化!