目录
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!
选择题:
题一:
题二:
题三:
题四:
题五:
编程题:
题一:数组颠倒
数字颠倒_牛客题霸_牛客网 (nowcoder.com)
思路一:
前后交换法:
第一步:定义一个数组接收元素,并计算数组长度,left指向第一个元素,right指向最后一个元素;
第二步:只要left < right,就交换两个元素;
第三步:打印字符串。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10] = {0};
scanf("%s",&arr);
int sz = strlen(arr);
int left = 0;
int right = sz-1;
//前后交换
while(left < right)
{
char num = arr[left];
arr[left] = arr[right];
arr[right] = num;
left++;
right--;
}
printf("%s",arr);
return 0;
}
题二:单词倒排
单词倒排_牛客题霸_牛客网 (nowcoder.com)
思路一:
第一步:由于正常情况下scanf的局限性,这里用gets来接收元素,并计算长度sz;
第二步:分别定义当前节点cur,开始节点start来定位一个单词的范围,以及记录数count;
第三步:首先数组整体倒置,然后从第一位开始,判断是字母就cur后移一位,不是字母就将start到cur-1区间的字母进行倒置,倒置完不是最后一个元素就添‘ ’(空格),再跳过所以非字母的元素;
第四步:循环判断直到全部遍历一遍,就是需要的结果。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//倒置
void my_reverse(char* left, char* right)
{
while (left < right)
{
char* tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
gets(arr);
//数组长度
int sz = strlen(arr);
//定位单词范围
char* cur = arr;
char* start = arr;
//记录单词有几个字母
int count = 0;
//整体倒置
my_reverse(arr, arr + sz - 1);
while (*cur != '\0')
{
//是字母就++
while (isalpha(*cur))
{
cur++;
}
//一个单词倒置
my_reverse(start, cur - 1);
//倒置后补空格
if(*cur != '\0')
*cur = ' ';
//跳过所有非字母
while (!isalpha(*cur) && *cur != '\0')
{
start = ++cur;
}
}
//打印
printf("%s", arr);
return 0;
}
思路二:
第一步:定义一个足够接收字符串长度的二维数组arr,以及初始化为“0”的“ i ”“ x ”;
第二步:scanf返回值,正确输入n个变量返回n,不匹配返回0,输入结束EOF,接收字母字符到一维数组中,只要后面不是'\n'就i++,否则直接退出循环;
第三步:从后往前将打印单词打印。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char arr[10000][21] = {0};
int i = 0;
int x = 0;
while(1)
{
//scanf返回值,正确输入n个变量返回n,不匹配返回0,输入结束EOF
x = scanf("%[a-z|A-Z]",arr[i]);
//如果输入结束,退出
if(getchar() == '\n')
break;
//记录单词个数
if(x)
i++;
}
//从后往前打印单词
for(int j = i;j >= 0;j--)
{
if(j > 0)
printf("%s ",arr[j]);
else
printf("%s",arr[j]);
}
return 0;
}
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!