✨作者:@平凡的人1
✨专栏:《小菜鸟爱刷题》
✨推荐刷题网站👉:进入网站
✨一句话:凡是过往,皆为序章
✨说明: 过去无可挽回, 未来可以改变
💘前言
最近,有粉丝私信问我,有没有比较推荐的在线刷题网站。实际上,如果是刚开始刷题的话,我是比较推荐👉牛客网
你可能会问了:为什么❓
- 对于新手比较友好,不会像其他一些刷题网站一上来就看不懂,不会做
- 牛客网是找工作必备的,同时也拥有大量的笔试题库
- 白嫖党的福利,一站式服务:课程+刷题+面经+求职+面试,最最最重要的里面的资源全部免费!
- 方便代码的调试运行
C语言的学习还是得基础知识+自己动手练习,这是我们常说的,学习的过程也得多刷题,这也是我建立这个专栏的初衷!
所以,如果是C语言新手,需要找一个可以在线练习的网站,我还是先建议你去牛客网刷题的,不要好高骛远哦!
下面,我们一起开始刷题把,如有错误,请指出哦💖
💘倒置字符串
🚪传送门
这道题有一点小坑:这是让我们倒置每一个单词即可,而不是倒置整个字符串,刚开始看错题目,一直写不出来😅
解题思路:题目也不难,将一句话的单词进行倒置,标点不倒置。我们可以采用三步翻转法:即先将字符串整体逆置,再对逆置后的字符串中每一个单词部分进行逆置。 比如:I like beijing.
第一步,字符串整体逆置,得到:.gnijieb ekil I
第二步,将字符串中每一个单词逆置,得到:beijing. like I
下面,实现我们的代码:
#include <stdio.h>
#include <assert.h>
void reverse(char* left, char* right)
{
assert(left);
assert(right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101] = {
0 };
//输入
gets(arr);//I like beijing.
//逆置
int len = strlen(arr);
//1. 逆序整个字符串
reverse(arr, arr + len - 1);
//2. 逆序每个单词
char* start = arr;
while (*start)
{
char* end = start;
while (*end != ' ' && *end != '\0')
{
end++;
}
reverse(start, end - 1);
if (*end != '\0')
end++;
start = end;
}
//输出
printf("%s\n", arr);
return 0;
}
提交运行:
💘BC60 带空格直角三角形图案
🚪传送门
解题思路:当前i行和j列满足的关系是什么找出来,即可很容易的写出这道题,右对角线满足i+j=n-1,而右对角线的左侧空格满足i+j<n-1,所以我们可以很容易的写出代码:
#include <stdio.h>
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+j<n-1)
{
printf(" ");
}
else
{
printf("* ");
}
}
printf("\n");
}
}
return 0;
}
提交运行:
💘BC96-有序序列判断
🚪传送门
解题思路:有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。就是说有序满足两种情况,一种是从大到小,另一种是从小到大,我们可以定义两个临时变量来帮助判断是否有序,一个判断有序,另一个判断无序。具体的有序或者无序的判断只需要去比较相邻元素的大小即可。下面实现代码:
#include <stdio.h>
int main()
{
int n = 0;
int arr[50] = {
0};
int flag1 = 1;//升序有序
int flag2 = 1;//降序有序
int i = 0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d ",&arr[i]);
}
for(i=0;i<n-1;i++)
{
if(arr[i]>=arr[i+1])
{
flag1 = 0;
}
if(arr[i]<arr[i+1])
{
flag2 = 0;
}
}
if(flag1+flag2 == 1)
{
printf("sorted\n");
}
else
{
printf("unsorted\n");
}
return 0;
}
提交运行:
💘BC100 有序序列合并
🚪传送门
题目意思很明确:行升序序列排列合并。合并问题是非常经典的,后面还有链表合并等这些,思路上都是一样的:当两个数组都有元素的时候,我们去比较大小(这里题目原因,并不需要开辟新的数组进行存储,你也可以开辟新的数组进行存储)进行输出即可。当其中一个没有元素了,另一个有元素,我们在对有元素的数组进行输出即可完成本题。话不多说,实现代码:
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
scanf("%d %d",&n,&m);
int i = 0;
int arr1[1000] = {
0};
int arr2[1000] = {
0};
for(i=0;i<n;i++)
{
scanf("%d ",&arr1[i]);
}
for(i=0;i<m;i++)
{
scanf("%d ",&arr2[i]);
}
i = 0;
int j = 0;
while(i<n&&j<m)
{
if(arr1[i]<arr2[j])
{
printf("%d ",arr1[i]);
i++;
}
else
{
printf("%d ",arr2[j]);
j++;
}
}
if(i==n)
{
for(;j<m;j++)
{
printf("%d ",arr2[j]);
}
}
else
{
for(;i<n;i++)
{
printf("%d ",arr1[i]);
}
}
return 0;
}
提交运行:
💘BC106 上三角矩阵判定
🚪传送门
解题思路:这种题,我们首先要知道在i行j列的矩阵中,题目的要求i和j满足一种对应的关系是什么,比如如果是对角线的话就是i=j,而题目要求主对角线以下的元素,那就说明了我们要满足i>j的元素。基于此,我们就可以很好的完成这道题目了:
#include <stdio.h>
int main()
{
int n = 0;
int arr[10][10] = {
0};
scanf("%d",&n);
int i = 0;
int j = 0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i>j)
{
if(arr[i][j]!=0)
{
printf("NO\n");
return 0;
}
}
}
}
printf("YES\n");
return 0;
}
提交运行:
💘BC107 矩阵转置
🚪传送门
题目要求很简单,就是想让你输入n行m列,输出m行n列。我们直接用for循环来搞定即可,下面实现代码:
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr[10][10] = {
0};
scanf("%d %d",&n,&m);
int i = 0;
int j = 0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(i = 1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ",arr[j][i]);
if(j%n==0)
{
printf("\n");
}
}
}
return 0;
}
提交运行:
💘总结
学习C语言的同时,我们也要去大量的刷题,提高自己的编程能力,如果你不太会做题,没有关系,不要害怕,越害怕只会越害怕。牛客网提供题解专区和讨论区会有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,我们可以先去看看别人的思路,别人的代码,然后自己进行实现,这也能提高我们的编程能力!让我们一起加油把🌹
转载:https://blog.csdn.net/weixin_60478154/article/details/125689792