目录
一、练习1:字符从两端向中间汇聚
这个程序演示了如何让字符从字符串的两端向中间逐渐显示。
cpp
#include <stdio.h>
#include <string.h> // 需要添加strlen函数的头文件
#include <windows.h> // 需要添加Sleep函数的头文件
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1) - 1; // 计算字符串长度
printf("%s\n", arr2); // 初始显示全#的字符串
while (left <= right)
{
Sleep(1000); // 延时1秒(Windows平台)
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2); // 每次更新后打印
}
return 0;
}

代码说明:
-
使用两个字符数组,
arr1
存储目标字符串,arr2
初始化为全#
-
使用
left
和right
两个指针从两端向中间移动 -
每次循环将
arr1
两端的字符复制到arr2
对应位置 -
使用
Sleep(1000)
实现1秒的延迟效果(Windows平台) -
每次更新后打印当前状态,形成动画效果
二、练习2:二分查找
这个程序演示了在有序数组中使用二分查找算法查找特定元素。
cpp
#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1; // 计算数组长度
int key = 7; // 要查找的数字
int mid = 0; // 记录中间元素的下标
int find = 0; // 查找标志
while (left <= right)
{
// 计算中间位置,避免整数溢出
mid = left + (right - left) / 2;
if (arr[mid] > key)
{
right = mid - 1; // 在左半部分继续查找
}
else if (arr[mid] < key)
{
left = mid + 1; // 在右半部分继续查找
}
else
{
find = 1; // 找到目标
break;
}
}
if (1 == find)
printf("找到了,下标是%d\n", mid);
else
printf("找不到\n");
return 0;
}

代码说明:
-
二分查找要求数组必须是有序的
-
使用
left
和right
标记查找范围的左右边界 -
每次取中间位置
mid
进行比较:-
如果中间值大于目标值,则在左半部分继续查找
-
如果中间值小于目标值,则在右半部分继续查找
-
如果相等则找到目标
-
-
使用
mid = left + (right - left) / 2
计算中间位置,避免(left + right)
可能导致的整数溢出 -
时间复杂度为O(log n),比顺序查找O(n)更高效
注意事项:
-
二分查找仅适用于有序数组
-
计算中间位置时推荐使用
left + (right - left) / 2
方式,避免整数溢出 -
查找结束时需要检查
find
标志来确定是否找到目标