第一题344.反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

ψ(`∇´)ψ 我的思路

  • 取到字符串的中点,依次交换前后两部分的位置
package string;

public class ReverseString {
public static void reverseString(char[] s) {
char temp;
for (int i = 0; i < (s.length)/2; i++) {
temp = s[s.length-i-1];
s[s.length-i-1] = s[i];
s[i] = temp;
}
}
}

时间复杂度为O(n)

  • 我记得有个reverse方法可以反转字符串,但是当时做题的时候没有找到使用方法,提交后查了一下,reverse是StringBuilder和String Buffer的方法
  • 关于交换我看代码随想录上用的是异或
     s[s.length-i-1] ^= s[i];
s[i] ^= s[s.length-i-1];
s[s.length-i-1] ^= s[i];
  • 我用异或试了一下,发现代码效率并没有明显的提升,而且异或交换一直有争议,所以以下题目我还是用最原始的交换方法

第二题 541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

  • 真费劲呐,读题读了半天,这题目翻译过来就是

每隔2k个反转前k个,尾数不够k个时候全部反转

ψ(`∇´)ψ 我的思路

package string;

public class ReverseStr {
public static String reverseStr(String s, int k) {
StringBuilder sb = new StringBuilder();
StringBuilder res = new StringBuilder();
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if((i+1)%(2*k)==0){//每隔2k
sb.append(chars,(i-2*k+1),k).reverse();
res.append(sb);//反转前k个字符串
sb.delete(0,k);//清空字符串
res.append(chars,(i-k+1),k);//拼接后k个字符串
}
}
//长度不足2k的剩下的字符串
String left = s.substring(res.length());
if(left.length()>=k){
sb.append(chars,(res.length()),k).reverse();
res.append(sb);//反转前k个字符串
sb.delete(0,k);//清空字符串
int len = res.length();
res.append(chars,(res.length()),(s.length()-len)); } else {
sb.append(left).reverse();
res.append(sb);//把剩下的所有的字符串反转并追加
}
return res.toString();
} public static void main(String[] args) {
String res = reverseStr("abcd", 2);
System.out.println(res);
}
}

时间复杂度为O(n)

  • 本来想着一个StringBuilder 就能解决问题,结果发现反转的时候,需要局部反转再拼接,所以只能用两个StringBuilder

第三题 剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

ψ(`∇´)ψ 我的思路

package string;

public class ReplaceSpace {

    public static String replaceSpace(String s) {//方法一:遍历替换
StringBuilder sb = new StringBuilder();
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i]==' '){
sb.append("%20");
} else {
sb.append(chars[i]);
}
}
return sb.toString();
} public static String replaceSpace2(String s) {//方法二:API
String replace = s.replace(" ","%20");
return replace;
} public static void main(String[] args) {
String s = "We are happy.";
System.out.println(replaceSpace2(s));
}
}

时间复杂度为O(n)

第四题 151. 反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

  • 他来了他来了,他带着中等题走来了‍♀️

ψ(`∇´)ψ 我的思路

  • 把原始字符串打散后倒序遍历,不为空的输出并拼上空格,删除最后一个空格
package string;

public class ReverseWords {

    public static String reverseWords(String s) {
StringBuilder sb = new StringBuilder();
String[] strs = s.split(" ");//以空格为界把原字符串打散成字符串数组
for (int i=strs.length-1 ; i>=0 ; i--) {
if(!strs[i].equals("")){
sb.append(strs[i]);
sb.append(" ");
}
}
sb.deleteCharAt(sb.length()-1);//删除最后一个空格
return sb.toString();
} public static void main(String[] args) {
String s = "a good example";
System.out.println(reverseWords(s));
}
}

时间复杂度为O(n)

  • 没找到这题的难点在哪,再给我这样的题我就要飘了啊‍♀️

第五题 剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

ψ(`∇´)ψ 我的思路

public static String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder();
sb.append(s.substring(n));//先把不需要遇到的字符串拼到前面来
sb.append(s,0,n);
return sb.toString();
}

时间复杂度为O(1)

  • 因为这题过于简单我就看了代码随想录的解法

class Solution {
public String reverseLeftWords(String s, int n) {
int len=s.length();
StringBuilder sb=new StringBuilder(s);
reverseString(sb,0,n-1);
reverseString(sb,n,len-1);
return sb.reverse().toString();
}
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
}
  • 方法很巧,就是两个部分分别反转后整体反转,因为涉及到三次反转,所以把反转的方法提取出来复用

  • 啊这就很尴尬了,代码随想录的方法巧是巧,可是既没有降低我的时间复杂度,也没有降低我的空间复杂度,我要这么巧的方法做什么啊

总结

  • 只要可以用StringBuilder,就没有我小瑶仙女儿解不出来的字符串啊哈哈哈哈哈ヾ(≧▽≦*)o

代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串的更多相关文章

  1. 剑指Offer 2. 替换空格 (字符串)

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 题目地址 https://ww ...

  2. 剑指offer-第六章面试中的各项能力(翻转单词的顺序VS左旋转字符串)

    //题目1:翻转单词顺序例如“Hello world!”翻转后为world! Hello. //思路:首先翻转整个字符串,然后再分别翻转每个单词. //题目2:左旋转字符串,是将字符串的前面几个(n) ...

  3. 【算法训练营day8】LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58-II. 左旋转字符串

    [算法训练营day8]LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58- ...

  4. 编程算法 - 左旋转字符串 代码(C)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/37689725 左旋转字符串 代码(C) 本文 ...

  5. 笔试算法题(13):反转链表 & 左旋转字符串

    出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: struct Node { int v; Nod ...

  6. 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串

    一.题目一:翻转单词顺序 1.1 题目说明 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...

  7. 【面试题042】翻转单词顺序VS左旋转字符串

    [面试题042]翻转单词顺序VS左旋转字符串 题目一:     输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.     例如输入字符串“I a ...

  8. 辗转相除法(GCD)求左旋转字符串

    本文写于2017-01-18,从老账号迁移到本账号,原文地址:https://www.cnblogs.com/huangweiyang/p/6297874.html 今天在牛客网上做了一道题,题意就是 ...

  9. 《剑指offer》第五十八题(左旋转字符串)

    // 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. // 请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcde ...

随机推荐

  1. 对象的反序列化流_ObjectInputStream和transient关键字瞬态关键字

    对象的反序列化流_ObjectInputStream package com.yang.Test.ObjectStreamStudy; import java.io.FileInputStream; ...

  2. 字符输出流_Writer类&FileWrite类介绍和字符输出流的基本使用_写出单个字符到文件

    字符输出流_Writer类&FileWrite类介绍 java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性抽象方法: void write(int c) ...

  3. 在Centos7.3下使用Siege对Django服务进行压力测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_87 Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续 ...

  4. RPM方式安装GreatSQL 8.0.25-16

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 一.系统信息 1.确认OS信息 2.OS优化调 ...

  5. .NET CORE 读书笔记之与.NET Framework对比

    .NET Framework存在的问题 它是属于系统级别安装的程序 操作系统内的所有程序共享一个.NET Framework实例,如果其中某一个应用程序需要升级Framework,其他程序也会收到影响 ...

  6. 程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果

    谁说程序员不懂浪漫? 作为程序员,用自己的代码本事手搓一个技术感十足的惊喜,我觉得,这是不亚于车马慢时代手写信的古典主义浪漫. 那么,应该怎样创作出具有自我身份属性的浪漫惊喜呢? 玩法很多,今天给大家 ...

  7. @babel/runtime 和 @babel/plugin-transform-runtime 两个的作用是什么

    Babel 最基础的功能就是将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 最基础的依赖包也就是 ...

  8. java中使用 POI导出excel表格的简单实现

    大概流程分7步: 1.创建工作簿 --> 2.创建sheet表 --> 3.创建row行(建议使用循环) --> 4.用row行逐一创建单元格(建议使用循环) --> 5.单元 ...

  9. [SDOI2017]序列计数 (矩阵加速,小容斥)

    题面 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希望,这n个数中,至少有一个数是质数. Alice想知道,有多少个序列满足她的要求 ...

  10. JOIOI王国 - 二分+贪心

    题面 题解 通过一句经典的话"最大值的最小值" 我判断它是二分题, 不难发现,整个图形中两个省的分界线是一条单调不递减或单调不递增的折线. 而且,越到后来它的最大值只会越来越大,最 ...