0
点赞
收藏
分享

微信扫一扫

vscode搭建springboot开发环境

55f0f6eb5fef45b8b31fc561c321cc87.png

目录

选择题:

题一:

题二:

题三:

题四:

题五:

编程题:

题一:数组颠倒

思路一:

题二:单词倒排

思路一:

思路二:

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!


选择题:

题一:

题二:

题三:

题四:

题五:

编程题:

题一:数组颠倒

数字颠倒_牛客题霸_牛客网 (nowcoder.com)

1daa110315604e588299ce6b18016b5a.png

思路一:

前后交换法:

        第一步:定义一个数组接收元素,并计算数组长度,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)

84d0d8d7d2e9485bb4dd9b6349bf1a3b.png

思路一:

        第一步:由于正常情况下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;
}

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                              c90de1178d0345148d109f22b2169307.jpeg

举报

相关推荐

0 条评论