✨作者:@平凡的人1
✨专栏:《小菜鸟爱刷题》
✨推荐刷题网站:进入网站
✨一句话:凡是过往,皆为序章
✨说明: 过去无可挽回, 未来可以改变
![]()
系列文章:C语言简单题目
刷题网站(题目来源):牛客网
话不多说,直接进入我们的主题
描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”正方形图案。
输入描述:
多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“*”的数量。
输出描述:
针对每行输入,输出用“”组成的“空心”正方形,每个“”后面有一个空格。
示例1
输入:
4
输出:
* * * * * * * * * * * *
示例2
输入:
5
输出:
* * * * * * * * * * * * * * * *
解题思路:打印图形问题,老朋友了。发现题目的要求规律,进行循环控制打出图案即可。比如这道题,我们可以将之看成一个矩阵(二维数组)我们需要找出第一行和最后一行,第一列和最后一列打印成*号,其他位置为空格即可解决这道题
#include
int main()
{
int n = 0;
while(~scanf("%d",&n))
{
int i =0;
for(i=0;i<n;i++)
{
int j = 0;
for(j=0;j<n;j++)
{
if(i==0||i==n-1||j==0||j==n-1)
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
描述
公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。
(注:本题有多组输入)
输入描述:
每一行,输入7个整数(0~100),代表7个成绩,用空格分隔。
输出描述:
每一行,输出去掉最高分和最低分的平均成绩,小数点后保留2位,每行输出后换行。
示例1
输入:
99 45 78 67 72 88 60
输出:
73.00
解题思路:注意两个重要的点:
1.我们需要进行多组输入,而且每一组是7个分数。多组输入我们可以进行循环输入即可,注意循环终止的条件!
2.找出最大的分数与最小的分数。我们可以假设最大的分数为0,最小的分数为100,如果当前输入的分数是大于最大的分数就赋值给它,如果小于最小的分数就赋值给它,最终我们会得到一个最大的数和一个最小的数,然后减去即可,这道题难度不大。
#include
int main()
{
int score = 0;
int i = 0;
int sum = 0;
int max = 0;
int min = 100;
int count = 0;
while(scanf("%d",&score)!=EOF)
{
sum+=score;
if(score>max)
max = score;
if(score<min)
min = score;
count++;
if(count == 7)
{
printf("%.2f\n",(sum-max-min)/5.0);
count = 0;
max = 0;
min = 100;
sum = 0;
}
}
return 0;
}
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(n)*O*(n) ,空间复杂度:O(1)*O*(1)
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
示例1
输入:
2012 12 31
输出:
366
示例2
输入:
1982 3 4
输出:
63
解题思路:我们都知道,在一年中1,3,5,7,8,10,12月都有31天。而4,6,9,11都有30天。最关键的问题在于2月的天数我们需要去判断是否为闰年。面对这么多种情况,我们可以用switch语句来进行条件判断,同时,要统计总的天数,case情况的放置我们也要按照从大到小进行放置,使之能够进行累加进来。有了思路之后,代码就能很好实现了:
#include
int main()
{
int year = 0;
int m = 0;
int day = 0;
scanf("%d %d %d",&year,&m,&day);
switch(m-1)
{
case 12: day+=31;
case 11: day+=30;
case 10: day+=31;
case 9: day+=30;
case 8: day+=31;
case 7: day+=31;
case 6: day+=30;
case 5: day+=31;
case 4: day+=30;
case 3: day+=31;
case 2:
if((year %4==0 &&year %100!=0)||year%400==0)
{
day+=29;
}
else
{
day+=28;
}
case 1: day+=31;
break;
}
printf("%d",day);
return 0;
}
描述
等差数列 2,5,8,11,14。。。。
(从 2 开始的 3 为公差的等差数列)
输出求等差数列前n项和
数据范围: 1 \le n \le 1000 \1≤n≤1000
输入描述:
输入一个正整数n。
输出描述:
输出一个相加后的整数。
示例1
输入:
2
输出:
7
说明:
2+5=7
示例2
输入:
275
输出:
113575
说明:
2+5+...+821+824=113575
解题思路:等差数列首项为2,公差d=3,根据数学公式我们知道第n项为2+(n-1)*3。好了,有了这些做铺垫,我们可以用一个for循环来轻松解决这道题目。代码实现:
#include
int main()
{
int n = 0;
int sum = 0;
scanf("%d",&n);
for(int i = 2;i<=(2+(n-1)*3);i+=3)
{
sum+=i;
}
printf("%d",sum);
return 0;
}
描述
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
0即不是正整数,也不是负数,不计入计算。如果没有正数,则平均值为0。
数据范围: 1 \le n\ \le 2000 \1≤n ≤2000 ,输入的整数都满足 |val| \le 1000 \∣val∣≤1000
输入描述:
首先输入一个正整数n,
然后输入n个整数。输出描述:
输出负数的个数,和所有正整数的平均值。
示例1
输入:
11 1 2 3 4 5 6 7 8 9 0 -1
输出:
1 5.0
示例2
输入:
3 0 0 0
输出:
0 0.0
解题思路:本题较为简单,我们需要记录负数的个数,以及正数和的平均值。同时要注意到输出格式的控制。代码实现:
#include
int main()
{
int n= 0;
scanf("%d",&n);
int count1 = 0;
int count2=0;
float sum = 0;
int arr[2000] = {0};
for(int i = 0;i<n;i++)
{
scanf("%d",&arr[i]);
if(arr[i]<0)
{
count1++;
}
if(arr[i]>0)
{
sum+=arr[i];
count2++;
}
}
if(count2 == 0)
{
printf("%d %0.1f\n",count1,0);
return 0;
}
printf("%d %0.1f\n",count1,sum/count2);
return 0;
}
描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1),时间复杂度:O(logn)
示例1
输入:
[3,4,5,1,2]
返回值:
1
示例2
输入:
[3,100,200,3]
返回值:
3
来波遍历找最小?NONONO,不是这样的,这道题的时间复杂度是有要求的。我们需要改变一下思路,基于二分查找的思想来解决这道题目:最小值左边递增,最小值右边也递增。且左边的元素都大于右边的元素
int minNumberInRotateArray(int* arr, int arrSize)
{
int left = 0;
int right = arrSize - 1;
while(left < right)
{
int mid = (left + right) / 2;
if(arr[mid] < arr[right])
right = mid;
else if(arr[mid] > arr[right])
left = mid + 1;
else
right -=1;
}
return arr[left];
}
通过上面练习几道牛客网的题目,我们简单做了一下分析。有时间的话,我们可以多去刷题,同时,有时间的话,我们可以一起交流学习,让我们一起刷题进步把!