剑指offer-42翻转单词顺序-左旋转字符串

2023-11-15

 

先来一道简单题:

将字符串左旋。输入abcdefg,输出cdefgab

package Leetcode;

/**
 * @Author: YCKJ3803
 * @Date: 2021/3/1 16:41
 * @Description:
 */
public class Zuoxuan {
    //直接用String的substring方法
    public static String zuoXuan(String str, int n) {
        return str.substring(n) + str.substring(0, n);
    }

    //使用StringBuilder的append方法,和String的charAt方法   StringBuilder线程不安全,效率高
    public static String zuoXuan2(String str, int n) {
        StringBuilder builder = new StringBuilder();
        for (int i = n; i < str.length(); i++) {
            builder.append(str.charAt(i));
        }
        for (int i = 0; i < n; i++) {
            builder.append(str.charAt(i));
        }
        return builder.toString();
    }

    //如果只让用String,不让使用StringBuilder的话,怎么办?
    public static String zuoXuan3(String str, int n) {
        String res = "";
        for (int i = n; i < str.length(); i++) {
            res += str.charAt(i);
        }
        for (int i = 0; i < n; i++) {
            res += str.charAt(i);
        }
        return res;
    }

    public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println(zuoXuan(str, 2));
    }
}

题意

题目描述

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

 

样例输入

student. a am I

I’m a Freshman and I like JOBDU!

样例输出

I am a student.

JOBDU! like I and Freshman a I’m

先反转整个字符串,再将每个单词内部翻转

先写一个reverse方法,将整个字符串都翻转一下,每次定义一个变量记录空白的位置,然后递归的使用reverse方法。

注:本题的i的变量,从后往前算。

 

package cn.com;

public class ReverseSentence {
    public static void main(String[] args) {
        String str = "I am a Student.";
        System.out.println(ReverseSentence(str));

    }
    public static String ReverseSentence(String str) {
        char[] chars = str.toCharArray();
        reverse(chars,0,chars.length - 1);
        int blank = -1;
        for(int i = 0;i < chars.length;i++){
            if(chars[i] == ' '){
                int nextBlank = i;
                reverse(chars,blank + 1,nextBlank - 1);
                blank = nextBlank;
            }
        }
        reverse(chars,blank + 1,chars.length - 1);//最后一个单词单独进行反转
        return new String(chars);

    }
    public static String  reverse(char[] chars,int low,int high){
        while(low < high){
            char temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            low++;
            high--;
        }
        return  chars.toString();
    }
}

如果面试者一下子就回答出来了,面试官会怀疑你之前看过这道题,会问你一个更深入的题。如下,要是左旋字符串,怎么办?

将字符串前面的若干字符移到尾部。如输入“abcdefg”和数字2,表示将前2个字符移到后面。变成“cdefgab”。

思路:三次reverse,前两次将每个部分的内部翻转,为“bagfedc”,第三次整体翻转,变为“cdefgab”。

package cn.com;
/*
剑指offer-42-左旋转字符串
 */

public class LeftReverse {
    public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println(LeftReverse(str,2));

    }
    public static String LeftReverse(String str, int n) {
        char[] chars = str.toCharArray();
        if(chars.length < n) return "";
        reverse(chars, 0, n-1);
        reverse(chars, n, chars.length-1);
        reverse(chars, 0, chars.length-1);
        StringBuilder sb = new StringBuilder(chars.length);
        for(char c:chars){
            sb.append(c);
        }
        return sb.toString();
    }

    public static void reverse(char[] chars,int low,int high){
        char temp;
        while(low<high){
            temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            low++;
            high--;
        }
    }
}

拓展:在编写Reverse方法时,char数组转化成String字符串输出时,经常会输出很奇怪的结果,如[C@1b6d3586,此时应该改写成String.valueOf(str),就可以输出正常的字符串的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指offer-42翻转单词顺序-左旋转字符串 的相关文章

  • java用正则表达式脱敏手机号

    一种正则形式 在Java开发中有时候需要对敏感字段数据脱敏 废话不多说 直接上代码 脱敏手机号 param str return 脱敏后字符串 public static String maskPhone String str return
  • Java变量的作用域:静态变量、全局变量和局部变量

    变量的作用域规定了变量所能使用的范围 只有在作用域范围内变量才能被使用 根据变量声明地点的不同 变量的作用域也不同 根据作用域的不同 一般将变量分为不同的类型 成员变量和局部变量 下面对这几种变量进行详细说明 成员变量 Java 的成员变量
  • Linux环境下PostgreSQL9.6+PostGIS2.5安装

    空间数据库原理上机实习要用 安了好久终于成功辽 由于在腾讯云上买好了服务器 所以直接远程登录了 一 PostgreSQL安装 1 导入yum源 sudo yum install y https download postgresql org

随机推荐

  • C++实现定时器

    定时器的主要数据 1 一个线程变量 保存定时器线程 2 一个互斥锁 配合条件变量使用 3 一个条件变量 结合互斥锁 可以是线程不执行任务时 睡眠一段时间 在退出调用时 可以唤醒线程完成退出 4 定时执行函数 具体的定时执行业务操作 5 间隔
  • 1核2G/2核4G的服务器centos安装哪个版本

    虽然目前的centos 8系统将会在今年停止更新维护 所以很多人担心和纠结该选择什么系统作为自己的服务器系统呢 不管是服务器是计算型共享型还是通用型服务器配置 都可以选择centos 8 x 具体关于通用型计算型和共享型服务器的介绍可以参考
  • python读取oracle数据库数据报编码错误

    UnicodeDecodeError gbk codec can t decode byte 0xa7 in position 2 illegal multibyte sequence 解决方法 根据数据库不同的编码设定 编写的python
  • webview中h5高德定位没有权限的问题Geolocation permission Denied

    网上都是说添加这两个东西 settings setDatabaseEnabled true settings setDomStorageEnabled true mWebView setWebChromeClient new WebChro
  • 02-工厂模式

    文章目录 1 简单工厂模式 2 工厂方法模式 3 抽象工厂模式 4 模式扩展 5 工厂模式在JDK中的应用 需求 设计一个咖啡店点餐系统 设计一个咖啡类 Coffee 并定义其两个子类 美式咖啡 AmericanCoffee 和拿铁咖啡 L
  • qt5中信号和槽连接,对于多种参数重载的处理

    因为QSpinBox的valueChanged信号有重载 为避免二义性 需要通过声明函数指针方式 来进行信号和槽的连接 void QSpinBox p int QSpinBox valueChanged 函数指针p前要加类名作用域符号 co
  • 假设u~N(0, 1), X

    假设 N 0 1 X
  • API HOOK

    本来这个方法是API HOOK中经常用到 但是我想试试在单个程序中实现 为何运行时总是错误 本来是一个函数跳另外一个的 我又后退了一步 只是用一个函数自己的前面8字节修改自己 还是会错误了 void CJmpDlg OnButton1 对应
  • JDBC 连接池配置文件 解决了already close问题

    XML文件 DataSource配置
  • 生命周期BeanPostProcessor(3)---Spring源码从入门到精通(九)

    上篇文章主要介绍了Bean生命周期 bean生命周期 创建bean gt 初始化init gt 销毁destory 而初始化和销毁是可以用 Bean指定的 或者用 PostCoustruct preDestory注解 或者用Initiali
  • 两个多项式相加算法(链表实现)

    来源 数据结构期中考试补充题 注 该代码测试数据较少 吃过晚饭有时间再测试下改改bug QAQ 多项式相加 include
  • Python3运行报错:TypeError: Object of type ‘type‘ is not JSON serializable解决方法(不是针对对象转Json的方法)

    问题描述 Python内置的json模块提供了非常完善的Python对象到JSON格式的转换 json dumps 将Python中的对象转换为JSON中的字符串对象 json loads 将JSON中的字符串对象转换为Python中的对象
  • OpenSystemArchitect从入门到放弃

    原因 pd每次建立外键都自动生成字段 这个设置找不到解决方案 就想着有不有替代pd的工具 结果百度 还真有 用OpenSystemArchitect的原因 开源免费 他的外键直观的展示2个表的关系 逻辑视图的支持 放弃 文档不全 好多问题没
  • YUM仓库及NFS共享服务理论

    文章目录 一 YUM仓库 1 YUM概述 2 准备安装源 3 访问YUM仓库 二 FNS共享存储服务 1 NFS概念 2 NFS使用场景 3 NFS服务 一 YUM仓库 1 YUM概述 YUM Yellow dog Updater Modi
  • Allegro添加相对传输延迟的等长规则设置

    怎么去添加相对传输延迟的等长规则 首先讲述的是通过直接添加法去添加 直接添加法只适用于点对点的传输模式 中间没有任何串阻 串容的情况 具体操作如下所示 01 打开规则管理器 打开规则管理器 执行菜单命令Setup Constraints 在
  • 抖之恒科技python常用库之工具库schema

    在Python编程语言中 有众多的开源库可以帮助程序员更加高效地完成各种任务 其中 Schema就是一款非常实用的工具库之一 本文将为您介绍Schema库的基本概念 使用方法以及它在Python编程中重要性 一 什么是Schema Sche
  • Koin入门使用

    一 简单流程 1 创建Koin容器 startKoin 创建一个Koin容器并注册到GlobalContext中 modules module 配置Koin模块并注入到Koin容器 2 创建Koin模块 class People val k
  • HDU1007(最近点对问题)

    题意不难理解 就是找到最近的两个点 计算其距离 除以2就是所求的圆的半径 思路很简单 运用分治的思想 先划分区间 分别找到左右区间中的最近点对 再合并区间 找到区间间的最近点对 注意如果用qsort 进行排序可能会超时 include
  • Qi v1.2.4 -- WPC官方文档资源下载

    WPC无线充电联盟QI协议1 2 4 zip qi 嵌入式文档类资源 CSDN下载QI协议part1 part2 part3 part4完整版 没有积分可使用链接 链接 httpqi更多下载资源 学习资料请访问CSDN下载频道 https
  • 剑指offer-42翻转单词顺序-左旋转字符串

    先来一道简单题 将字符串左旋 输入abcdefg 输出cdefgab package Leetcode Author YCKJ3803 Date 2021 3 1 16 41 Description public class Zuoxuan