【牛客面试必刷TOP101】Day13.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:

代码:

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

代码解析:

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

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

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


代码注释解析2:

代码:

res = res.reverse();
        for (int i = 0; i < n; i++){
            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:


总结

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值