• 【牛客面试必刷TOP101】Day9.BM83 字符串变形和BM91 反转字符串


    作者简介:大家好,我是未央;

    博客首页:未央.303

    系列专栏:牛客面试必刷TOP101

    每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!


    前言

    一、字符串变形

    题目描述

    描述:

    对于一个长度为 n 字符串,我们需要对它做一些变形。

    首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

    比如"Hello World"变形后就变成了"wORLD hELLO"。


    数据范围: 1≤n≤106 , 字符串中包括大写英文字母、小写英文字母、空格。

    进阶:空间复杂度 O(n) , 时间复杂度 O(n)


    输入描述:

    给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)

    返回值描述:

    请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。


    示例1:


    示例2:


    示例3:


    解题分析

    解题思路:

    双逆转方法:

    将单词位置的反转,那肯定前后都是逆序,不如我们先将整个字符串反转,这样是不是单词的位置也就随之反转了。但是单词里面的成分也反转了啊,既然如此我们再将单词里面的部分反转过来就行。


    解题步骤:

    • step 1(大小写转换):遍历字符串,遇到小写字母,转换成大写,遇到大写字母,转换成小写,遇到空格正常不变。
    • step 2(所有字符串反转):第一次反转整个字符串,这样基本的单词逆序就有了,但是每个单词的字符也是逆的。
    • step 3(单词反转回正序):再次遍历字符串,以每个空间为界,将每个单词反转回正常。

    代码编写:


    代码注释解析1:

    代码:

    1. for(int i = 0; i < n; i++){
    2. //大小写转换
    3. if(s.charAt(i) <= 'Z' && s.charAt(i) >= 'A')
    4. res.append((char)(s.charAt(i) - 'A' + 'a'));
    5. else if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z')
    6. res.append((char)(s.charAt(i) - 'a' + 'A'));
    7. else
    8. //空格直接复制
    9. res.append(s.charAt(i));
    10. }

    代码解析:

    这段代码是一个字符大小写转换的逻辑。它的作用是将字符串s中的所有大写字母转换为小写字母,同时将所有小写字母转换为大写字母,而其他非字母字符保持不变。具体的实现如下:

    • 如果当前字符s.charAt(i)是大写字母,则使用字符减法将其转换为小写字母,再使用append方法将转换后的字符添加到res中。
    • 如果当前字符s.charAt(i)是小写字母,则使用字符减法将其转换为大写字母,再使用append方法将转换后的字符添加到res中。
    • 否则,即当前字符s.charAt(i)不是字母,则直接将该字符添加到res中。

    最终,res中存储了字符大小写转换后的结果。注意,此处假设输入的字符串s只包含字母和其他非字母字符。


    代码注释解析2:

    代码:

    1. res = res.reverse();
    2. for (int i = 0; i < n; i++){
    3. int j = i;

    代码解析:

    这段代码的作用是翻转整个字符串。

    首先,使用reverse()方法将之前处理得到的字符串res进行翻转,即将字符串中的字符顺序颠倒过来,然后将翻转后的结果重新赋值给res。

    接下来,使用一个循环遍历整个字符串。循环变量i从0开始,逐步增加,直到i等于n(字符串的长度)为止。

    在每次循环中,将i的值赋给新的变量j,即j=i。这么做的目的可能是为了保留i的值,以备后续使用。

    总的来说,这段代码的作用是将处理后的字符串进行翻转,并且在后续的代码中可能会使用变量j来进行进一步处理。


    代码注释解析3:

    代码:

    在这个例子中,循环的目的是从字符串的某个位置开始,查找后续的空格字符,并对之前的部分进行翻转。

    在循环内部,使用while循环来寻找空格字符。循环变量j从i开始逐步增加,直到j小于字符串的长度n且res.charAt(j)不等于空格字符为止。

    找到空格字符后,使用substring方法将从位置i到j-1的子串提取出来,并将提取的子串赋值给变量temp。

    接下来,创建一个StringBuffer对象buffer,并使用temp初始化它。

    然后,使用reverse方法将buffer中的字符顺序翻转,并使用toString方法将翻转后的结果转换为字符串,再将翻转后的字符串赋值给变量temp。

    最后,使用replace方法将res中从位置i到j-1的子串替换为temp。

    接着,将i更新为j,以便在下一次循环中从j的位置开始继续查找空格字符。

    循环结束后,将处理后的字符串res转换为String类型并返回。

    总的来说,这段代码的作用是将字符串按照空格字符进行分隔,在每个以空格分隔的子串中进行翻转,并将所有子串翻转后的结果合并成一个字符串,最终返回结果。



    二、判断是否为回文字符串

    题目描述

    描述:

    写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)


    数据范围: 0≤n≤1000

    要求:空间复杂度 O(n),时间复杂度O(n)


    示例1:


    示例2:


    解题分析

    解题思路:

    思路1:

    开辟一个和str长度大小相同的一个字符串ans,把传入的str倒序赋值到ans字符串上;

    时间复杂度O(n),额外空间复杂度O(n);

    过程如图:


    思路2:

    原地交换,str[i]=str[len−1−i],注意:交换进行的次数是len/2次

    时间复杂度O(n),额外空间复杂度O(1);


    代码编写:

    思路1:


    思路2:


    总结

  • 相关阅读:
    Python实现双目标定、畸变矫正、立体矫正
    〖Python 数据库开发实战 - MySQL篇㉖〗- 数据删除操作 - DELETE语句
    文献越读_细菌中5‘UTR上RG4促进翻译效率
    SpringBoot+Vue项目招生管理系统
    rabbitmq之总览全局
    Ubuntu20.04 LTS安装Nextcloud
    MySQL视图
    性能_3 jmeter连接数据库jdbc(sql server举例)
    【java中的反射】1.初识反射
    Ubuntu下 非wheel组不能切换到 root su root必须输入密码 sudo时必须输入账户密码 账户需具有sudo权限
  • 原文地址:https://blog.csdn.net/qq_64861334/article/details/133708645