当前位置: 首页 > news >正文

剑指Offer系列(java版,详细解析)58.翻转字符串

题目一

题目描述

翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。

例如输入字符串“I am a student”,则输出“student. a am I”。

测试用例

  • 功能测试(句子中有多个单词;句子中只有一个单词)
  • 特殊输入测试(字符串指针为空指针;字符串的内容为空;字符串中只有空格)

解题思路

在不需要额外空间的解题思路(参考解题)

  1. 反转整个字符串
  2. 反转每个单词

自己解题

class Solution {
    public String reverseWords(String s) {
        s = s.trim(); // 删除首尾空格
        int j = s.length() - 1, i = j;
        StringBuilder res = new StringBuilder();
        while(i >= 0) {
            while(i >= 0 && s.charAt(i) != ' ') i--; // 搜索首个空格
            res.append(s.substring(i + 1, j + 1) + " "); // 添加单词
            while(i >= 0 && s.charAt(i) == ' ') i--; // 跳过单词间空格
            j = i; // j 指向下个单词的尾字符
        }
        return res.toString().trim(); // 转化为字符串并返回
    }
}

参考解题

class Solution {
    public String reverseWords(String s) {
        String[] strs = s.trim().split(" "); // 删除首尾空格,分割字符串
        StringBuilder res = new StringBuilder();
        for(int i = strs.length - 1; i >= 0; i--) { // 倒序遍历单词列表
            if(strs[i].equals("")) continue; // 遇到空单词则跳过
            res.append(strs[i] + " "); // 将单词拼接至 StringBuilder
        }
        return res.toString().trim(); // 转化为字符串,删除尾部空格,并返回
    }
}

题目二

题目描述

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

难度简单107收藏分享切换为英文接收动态反馈

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

示例 1:

输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例 2:

输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

限制:

  • 1 <= k < s.length <= 10000

测试用例

  • 功能测试(把长度为n的字符串左旋转0个字符、1个字符、2个字符、n-1个字符、n个字符、n+1个字符)
  • 特殊输入测试(字符串的指针为空指针)

解题思路

把该题与题目一联系起来,如下面的例子

“abcdefg”在左旋2的情况下可以看成“ab”,“cdefg”两部分,我们按照题目一的思路,先反转整个整个字符,然后再反转每个单词,得到就是“cdefgab”。这与我们所有想要的得到的东西相同。

自己解题

class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n, s.length()) + s.substring(0, n);
    }
}

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder();
        for(int i = n; i < s.length(); i++)
            res.append(s.charAt(i));
        for(int i = 0; i < n; i++)
            res.append(s.charAt(i));
        return res.toString();
    }
}

参考解题

见自己解题

题目考点

  • 考察应聘者的知识迁移能力。
  • 考察应聘者对字符串的编程能力。

相关文章:

  • 剑指Offer系列(java版,详细解析)59.队列的最大值
  • 剑指Offer系列(java版,详细解析)60.n个骰子的点数
  • 剑指Offer系列(java版,详细解析)61.扑克牌中的顺子
  • 剑指Offer系列(java版,详细解析)62.圆圈中最后剩下的数字
  • 剑指Offer系列(java版,详细解析)63.股票的最大利润
  • 剑指Offer系列(java版,详细解析)64.求1+2+...+n
  • 剑指Offer系列(java版,详细解析)65.不用加减乘除做加法
  • 剑指Offer系列(java版,详细解析)66.构建乘积数组
  • 剑指Offer系列(java版,详细解析)67.把字符串转化成整数
  • 剑指Offer系列(java版,详细解析)68.树中两个节点的最低公共祖先
  • Go语言fmt.Sprintf(格式化输出)
  • Go 面试系列:Go interface中nil的比较问题
  • Go 面试系列: new 和 make有什么不同之处呢?
  • Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?
  • 什么是读、写扩散?
  • 【Leetcode】101. 对称二叉树
  • 【个人向】《HTTP图解》阅后小结
  • django开发-定时任务的使用
  • ES6系统学习----从Apollo Client看解构赋值
  • exports和module.exports
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JS题目及答案整理
  • React-flux杂记
  • SpringCloud集成分布式事务LCN (一)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 初探 Vue 生命周期和钩子函数
  • 从伪并行的 Python 多线程说起
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 学习笔记TF060:图像语音结合,看图说话
  • 赢得Docker挑战最佳实践
  • 正则表达式
  • 最近的计划
  • 阿里云移动端播放器高级功能介绍
  • # 透过事物看本质的能力怎么培养?
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • %@ page import=%的用法
  • (02)Hive SQL编译成MapReduce任务的过程
  • (C语言)fread与fwrite详解
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (九)c52学习之旅-定时器
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)Linux Shell编程——输入输出重定向
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Scala的“=”符号简介
  • .net core 控制台应用程序读取配置文件app.config
  • .net mvc部分视图
  • .net 发送邮件
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET运行机制