首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >面试官:手写一个二分查找吧。我:然后TA盯着我改了10分钟Bug...

面试官:手写一个二分查找吧。我:然后TA盯着我改了10分钟Bug...

作者头像
码途随笔
发布2026-01-12 19:55:19
发布2026-01-12 19:55:19
870
举报

一、三角形判断

题目:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int a, b, c;
	while (scanf("%d%d%d", &a, &b, &c) != EOF)
	{
		if ((a + b) > c && (a + c) > b && (b + c) > a)
		{
			if ((a == b) && (b == c))
			{
				printf("Equilateral triangle!\n");
			}
			else if ((a == b) && (a != c))
			{
				printf("Isosceles triangle!\n");

			}
			else
			{
				printf("Ordinary triangle!\n");
			}
		}
		else
		{
			printf("Not a triangle!\n");
		}
	}
}

注意点:本题关系式比较多,需要用括号括起来,联系实际生活

二、分数求和

题目:

代码语言:javascript
复制
int main()
{
	int i = 0;
	double sum = 0;
	int flag = 1;
	for (i = 1; i <= 100; i++)
	{
		sum = sum + 1.0 * flag / i;
		flag = -flag;
	}
	printf("%lf", sum);
	return 0;
}

注意:要执行小数除法,sum要double类型,printf格式要%lf

三、数9的个数

题目:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
int main()
{
	int count = 0;
	for (int i = 0; i < 100; i++)
	{
		if (i % 10 == 9)
		{
			count++;
		}
		if (i / 10 == 9)
		{
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

注意:if-if和if-else不一样,后者是求数字有多少个,思路是分个位或十位

四、打擂台求最大值

题目:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
int main()
{
	int arr[10] = { 1,3,5,7,2,5,8,4,10,4 };
	int max = arr[0];
	for (int i = 1; i < 10; i++)
	{
		if (max < arr[i])
		{
			max = arr[i];
		}
	}
	printf("%d", max);
	return 0;
}

五、多个字符向中间靠拢

题目: 多个字符向两端移动,向中间靠拢

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<stdlib.h>
int main()
{
	char arr1[] = "welcome to Changsha!!!";
	char arr2[] = "**********************";
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s", arr2);
		Sleep(1000);
		system("cls");
		left++;
		right--;
	}
	printf("%s", arr2);
	return 0;
}

六、二分查找

使用前提:在有序的数据中查找

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int arr[] = { 1,3,6,8,9,10,20,25,30 };
	printf("输入要找的数:");
	int key;
	scanf("%d", &key);
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int flag = 0;
	while (left<=right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标为%d", mid);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("找不到\n");
	}
	return 0;
}

进阶

代码语言:javascript
复制
#include<stdio.h>
int binarySearch(int arr[],int x,int y)
{
	int left = 0;
	int right = x - 1;
	while (left <= right)
	{
		int mid = left + ((right - left) >> 1);
		if (arr[mid]<y)
		{
			left = mid + 1;
		}
		else if (arr[mid]>y)
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}
int main()
{
	int arr[] = { 1,4,6,8,9,10,14 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int ret = binarySearch(arr,len,12);
	if (ret != -1)
	{
		printf("找到了,在%d位上\n",ret);
		printf("值是%d", arr[ret]);
	}
	else
	{
		printf("没找到\n");
	}
	return 0;
}

理清逻辑

七、九九乘法表

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i < 10; i++)
	{
		int j = 0;
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%-2d ", j, i, j * i);
		}
		printf("\n");
	}
	return 0;
}

注意i和j的关系

八、辗转相除法

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int a = 24;
	int b = 18;
	int c = a % b;
	while (c != 0)
	{
		a = b;
		b = c;
		c = a % b;
	}
	printf("%d", b);
	return 0;
}

while循环结束的条件是c==0,则继续的条件是c!=0

九、输入十个数求平均值

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	int sum = 0;
	for (i = 0; i < 10; i++)
	{
		sum += arr[i];
	}
	printf("%d\n", sum);
	double avg = sum * 1.0 / 10;
	printf("%lf\n", avg);
	return 0;
}

注意:平均值要用double类型和%lf

十、X形图案

分析思路

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int input;
	while (scanf("%d", &input) != EOF)
	{
		for (int i = 0; i < input;i++)
		{
			for (int j = 0; j < input; j++)
			{
				if (i == j || i + j == input - 1)
				{
					printf("*");
				}
				else
				{
					printf(" ");
				}
			}
			printf("\n");
		}
	}
	return 0;
}

十一、空心正方形图案

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int input;
	while (scanf("%d", &input) != 0)
	{
		for (int i = 0; i < input; i++)
		{
			for (int j = 0; j < input; j++)
			{
				if (i == 0 || i == input - 1)
				{
					printf("* ");
				}
				else if (j == 0 || j == input - 1)
				{
					printf("* ");
				}
				else
				{
					printf("  ");
				}
			}
			printf("\n");
		}
	}
	return 0;
}

十二、矩阵转置

由于VS上不支持变长数组,所以下面拿2行3列来举例

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int arr[2][3];
	for (int i = 0; i <2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("%d ", arr[j][i]);
		}
		printf("\n");
	}
}

跟前几个题一样,需要仔细观察,本题的关键是打印时,由原来的2行3列变为3行2列,原来的下标[i][j]换成[j][i]

十三、逆序输出

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	for (int j = 9; j >= 0; j--)
	{
		printf("%d ",arr[j]);
	}
	return 0;
}

十四、数组元素交换

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4 };
	int arr2[] = { 5,6,7,8 };
	int len = sizeof(arr1) / sizeof(arr1[0]);
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n===========\n");
	for (int i = 0; i < len; i++)
	{
		int temp = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = temp;
	}
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

每次i向前变化时,都要重新定义temp

十五、有序序列合并(逻辑完整)

如何在不排序的情况下,把它给合并排序

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int n;
	int m;
	scanf("%d%d", &n, &m);
	int arr1[1000] = { 0 };
	int arr2[1000] = { 0 };
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr1[i]);
	}
	for (int i = 0; i < m; i++)
	{
		scanf("%d", &arr2[i]);
	}

	int i = 0;
	int j = 0;
	while (i < n && j < m)
	{
		if (arr1[i] < arr2[j])
		{
			printf("%d ", arr1[i]);
			i++;
		}
		else if (arr1[i] > arr2[j])
		{
			printf("%d ", arr2[j]);
			j++;
		}
		else
		{
			printf("%d ", arr1[i]);
			i++;
		}

	}
	while (i < n)
	{
		printf("%d ", arr1[i]);
		i++;
	}
	while (j < m)
	{
		printf("%d ", arr2[j]);
		j++;
	}
	return 0;
}

十六、封装函数求素数

代码语言:javascript
复制
_Bool is_prime(int x)
{
	if (x == 1)
	{
		return true;
	}
	for (int i = 2; i < x; i++)
	{
		if (x % i == 0)
		{
			return false;
		}
	}
	return true;
}
int main()
{
	for (int i = 1; i < 100; i++)
	{
		if (is_prime(i))
		{
			printf("%d ", i);
		}
	}
	return 0;
}

十六、数组逆置

代码语言:javascript
复制
void Print(int arr[],int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
}
void Reverse(int arr[], int len)
{
	int left = 0;
	int right = len - 1;
	while (left < right)
	{
		int temp = arr[right];
		arr[right] = arr[left];
		arr[left] = temp;
		left++;
		right--;
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8 };
	int len = sizeof(arr) / sizeof(arr[0]);
	Reverse(arr, len);
	Print(arr, len);
	return 0;
}

十七、喝汽水问题

分析过程:

代码语言:javascript
复制
int main()
{
	int money;
	scanf("%d", &money);
	int total = money;
	int empty = money;
	while (empty > 1)
	{
		total = total + empty / 2;
		empty = empty / 2 + empty % 2;
	}
	printf("%d\n", total);
	return 0;
}

画图举例观察

十八、打印菱形

分析思路:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int line;
	scanf("%d", &line);
	for (int i=0; i < line; i++)
	{
		for (int j=0; j < line - 1 - i; j++)
		{
			printf(" ");
		}
		for (int j=0; j < 2 * i + 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for (int i = 0; i < line - 1; i++)
	{
		for (int j = 0; j < i + 1; j++)
		{
			printf(" ");
		}
		for (int j = 0; j < (line - 1 - i) * 2 - 1;j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

观察规律

十九、水仙花数

  • 如何求数字个数
  • 如何得到每一位数
  • 如何算阶乘
代码语言:javascript
复制
int main()
{
	for (int i = 100; i < 1000; i++)
	{
		int temp = i;
		int count = 0;
		while (temp)
		{
			count++;
			temp /= 10;
		}
		temp = i;
		int sum = 0;
		while (temp)
		{
			sum += pow(temp % 10, count);
			temp /= 10;
		}
		if (sum == i)
		{
			printf("%d ",i);
		}
	}
	return 0;
}

i/=i的话,i变成0了,无法求后面i的每一位了,所以先定义临时变量temp

二十、n的阶乘

代码语言:javascript
复制
#include<stdio.h>
int Fuc(int x, int y)
{
	if (y == 1)
	{
		return x;
	}
	else
	{
		return x*Fuc(x, y - 1);
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	int i;
	scanf("%d", &i);
	int ret = Fuc(n, i);
	printf("%d", ret);
	return 0;
}

限制条件往往是你思考的起点

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、三角形判断
  • 二、分数求和
  • 三、数9的个数
  • 四、打擂台求最大值
  • 五、多个字符向中间靠拢
  • 六、二分查找
  • 七、九九乘法表
  • 八、辗转相除法
  • 九、输入十个数求平均值
  • 十、X形图案
  • 十一、空心正方形图案
  • 十二、矩阵转置
  • 十三、逆序输出
  • 十四、数组元素交换
  • 十五、有序序列合并(逻辑完整)
  • 十六、封装函数求素数
  • 十六、数组逆置
  • 十七、喝汽水问题
  • 十八、打印菱形
  • 十九、水仙花数
  • 二十、n的阶乘
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档