知识点总结:
1.奇数最低比特位上的数字是1,偶数最低比特位上的数字是0。
2.二维数组在传参时,列号不可省略,行号可以省略,但是传参时一定是二维数组的形式。
二维数组中,根据角落数字的比较可以较快的淘汰部分行或者部分列,提高效率。
3.所有的数组在传参时都会降级为指针,所以在函数内部使用sizeof()求取数组大小是不可取的。
代码练习
1.调整数组使奇数全部都位于偶数前面
#include<stdio.h>
void ex_num(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
while (left < right)
{
if (!(arr[left] & 1) && (arr[right]&1))
{
ex_num(&arr[left], &arr[right]);
}
if ((arr[left] & 1))
{
left++;
}
if(!(arr[right] & 1 ))
{
right--;
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
2.在杨氏矩阵中查找目标数字是否存在
#include<stdio.h>
int find_data(int arr[][3], int row, int col, int data)
{
int i = 0;
int j = col - 1;
if (data < arr[0][0])
{
return 0;
}
if (data>arr[row - 1][j])
{
return 0;
}
while (i < row && j >= 0)
{
if (data < arr[i][j])
{
j--;
}
else if (data>arr[i][j])
{
i++;
}
else
{
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = {
{ 1, 2, 3 },
{ 2, 3, 4 },
{ 3, 4, 5 },
};
int data = 0;
printf("please enter: \n");
scanf("%d", &data);
int ret = find_data(arr, 3, 3, data);
if (ret)
{
printf("找到了!!!\n");
}
else
{
printf("没找到 \n");
}
return 0;
}