书籍翻转字符串(5)0923

题目

给定一个字符类型的数组chas,请在单词间做逆序调整,只要做到单词顺序逆序即可,对空格的位置没有特别要求。

举例

如果把chas看作字符串为"dog loves pig",调整为"pig loves dog"。

如果把chas看作字符串为"I'm a student.",调整为"student . a I'm"。

补充题目

给定一个字符类型的数组chas和一个整数size,请把大小为size的左半区调整移到右半区,右半区整体移到左边。

举例

如果把chas看作字符串为"ABCDE",size=3,调整成"DEABC"。

要求

如果chas长度为N,两道题都要求时间复杂度为O(N)。额外空间复杂度为O(1)。

java 复制代码
public void rotate(char[] chas){
        if (chas == null || chas.length == 0){
            return;
        }
        reverse(chas,0,chas.length-1);
        int l = -1;
        int r = -1;
        for (int i = 0; i < chas.length; i++) {
            if (chas[i] != ' ') {
                //先计算出左边游标的位置
                l = i == 0 || chas[i-1] == ' '? i : l;
                //计算出右边游标的位置
                r = i == chas.length-1 || chas[i+1] == ' '? i : r;
            }
            //如果左右游标都有值,则翻转
            if (l != -1 && r != -1){
                reverse(chas,l,r);
                l = -1;
                r = -1;
            }
        }
}



public static void reverse(char[] chas,int start,int end){
        char temp = 0;
        while(start < end){
            temp = chas[start];
            chas[start] = chas[end];
            chas[end] = temp;
            start++;
            end--;
        }
 }




   public static void reverse(char[] chas,int size){
        if (chas == null || chas.length == 0 || size >= chas.length || size <= 0){
            return;
        }
        reverse(chas,0,size-1);
        reverse(chas,size,chas.length-1);
        reverse(chas,0,chas.length-1);
    }




public static void rotate2(char[] chas,int size) {
        if (chas == null || chas.length == 0 || size >= chas.length || size <= 0) {
            return;
        }
        int start = 0;
        int end = chas.length - 1;
        int lpart = size;
        int rpart = chas.length - size;
        int s = Math.min(lpart, rpart);
        int d = lpart-rpart;
        while (true) {
            exchange(chas, start, end, s);
            if (d == 0) {
                break;
            }
            if (d > 0) {
                start += s;
                lpart = d;
            } else {
                end -= s;
                rpart = -d;
            }
            s = Math.min(lpart, rpart);
            d = lpart - rpart;
        }
    }
    public static void exchange(char[] chas,int start,int end,int size){
        int i = end - size + 1;
        char tmp = 0;
        while(size-- != 0){
            tmp = chas[start];
            chas[start] = chas[i];
            chas[i] = tmp;
            start++;
            i++;
        }
    }
相关推荐
皮卡祺q4 分钟前
【算法-0】背包问题(三维+二维)
java·javascript·算法
葫三生13 分钟前
《论三生原理》对《周易》《道德经》的一次根本性重写?
人工智能·算法·计算机视觉·区块链·量子计算
心中有国也有家19 分钟前
ascend-boost-comm:一次写完,到处复用——算子公共平台的 M×N 哲学
人工智能·经验分享·笔记·分布式·算法
AI科技星22 分钟前
空间圆柱螺旋运动第一性原理终极推导·证明·核验·全量纲闭环
开发语言·人工智能·算法·计算机视觉·量子计算
qq7422349841 小时前
全面深入的C#核心知识体系与编程实践精要——从语法基础到高级特性系统学习指南
java·算法·c#
代码中介商1 小时前
排序算法完全指南(五):快速排序深度详解
数据结构·算法·排序算法
Eloudy1 小时前
定常约束的情况下,质点矢径 r_i 不显含时间t
人工智能·算法·机器学习
徐安安ye2 小时前
FlashAttention的OOM排查:为什么显存够了还是报内存不足?
人工智能·算法·机器学习
2601_957882242 小时前
一条视频如何自动适配5大平台的技术实现
人工智能·算法·机器学习
子琦啊2 小时前
【算法复习】哈希|Map 与 Set 两个高频套路
算法·哈希算法