首页 > 试题广场 >

左旋转字符串

[编程题]左旋转字符串
  • 热度指数:448669 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列  S ,请你把其循环左移 K 位后的序列输出。例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc”

数据范围:输入的字符串长度满足
进阶:空间复杂度 ,时间复杂度
示例1

输入

"abcXYZdef",3

输出

"XYZdefabc"
示例2

输入

"aab",10

输出

"aba"
一般般的办法,甚至有点笨比
public String LeftRotateString (String str, int n) {
        // write code here
        if(str == null || str.length() == 0 || n == 0){
            return new String();
        }
        int len = str.length();
        int rotate = n % len;
        StringBuilder result  = new StringBuilder();
        for(int i = 0; i < len - rotate; i++){
            result.append(str.charAt(i + rotate));
        }
        for(int i = len - rotate; i < len; i++){
            result.append(str.charAt(i - len + rotate));
        }
        return result.toString();
    }

发表于 2024-09-16 20:20:17 回复(0)
轻松过
public class Solution {
    public String LeftRotateString(String str, int n) {
        if (str.length() == n || str.length() <= 1) return str;
        if (n > str.length())   n = n%str.length();
            return str.substring(n, str.length()) + str.substring(0, n);
    }
}


编辑于 2024-01-25 14:35:24 回复(0)
public class Solution {
    public String LeftRotateString(String str, int n) {
        String result = "";
        if(str == null || str.length() == 0){
            return result;
        }
        if (str.length() > n) {
            result = str.substring(n) + str.substring(0, n);
        } else if (str.length() < n) {
            for (int i = 0; i < n / str.length() + 2; i++) {
                result += str;
            }
            result = result.substring(n, n + str.length());

        } else {
            result = str;
        }
        return result;
    }
}

发表于 2023-06-15 10:50:44 回复(0)
public class Solution {
    public String LeftRotateString(String str, int n) {
        if(str.length() == 0) return "";
        char[] cstr = str.toCharArray();
        int len = cstr.length;
        char[] ans = new char[len];
        int pers = n % len;
        for (int i = 0; i < len; i++) {
            if (i < pers) ans[i] = cstr[i];
            if (i + pers < len) cstr[i] = cstr[i + pers];
        }
        for (int i = 0; i < pers; i++) {
            cstr[i + len - pers] = ans[i];
        }
        return new String(cstr);
    }
}

发表于 2023-03-08 21:43:14 回复(0)
public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str.length() == 0){
            return "";
        }
        int len = str.length();
        n = n % len;
        return str.substring(n) + str.substring(0, n);
    }
}


发表于 2022-08-30 18:25:47 回复(0)
使用双端队列
import java.util.Deque;
import java.util.LinkedList;
public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str==null||str.equals(""))
            return "";
        char[] chars=str.toCharArray();
        Deque<Character> deque=new LinkedList();
        for(char c:chars)
            deque.offer(c);
        for(int i=0;i<n;i++){
            char c=deque.poll();
            deque.offer(c);
        }
        StringBuilder builder=new StringBuilder();
        while(!deque.isEmpty())
            builder.append(deque.poll());
        return builder.toString();
        
        
    }
}


发表于 2022-08-30 15:17:20 回复(0)
public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str.length()==0) return str;
        int m=n%str.length();
        String str1=str+str;
         return str1.substring(m,m+str.length());   
    }
}
发表于 2022-08-28 21:46:15 回复(0)

StringBuilder

public String LeftRotateString(String str, int n) {
        if (str.isEmpty()) return "";
        int len = str.length();
        n = n % len;

        StringBuilder sb = new StringBuilder(str);
        sb.append(sb.substring(n));
        sb.append(sb.subSequence(0, n));
        sb.delete(0, len);
        return sb.toString();
    }

三次翻转

    static class JZLeftRotateString {
        public String LeftRotateString(String str, int n) {
            if (str.isEmpty()) return "";

            int len = str.length();
            n = n % len;
            char[] strs = str.toCharArray();

            reverse(strs, 0, len - 1);
            reverse(strs, 0, len - n - 1);
            reverse(strs, len - n, len - 1);
            return new String(strs);
        }

        public void reverse(char[] strs, int left, int right) {
            while (left < right) {
                char tmp = strs[left];
                strs[left++] = strs[right];
                strs[right--] = tmp;
            }
        }
    }
发表于 2022-08-17 20:49:25 回复(0)
public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str.length()==0) return str;
        int len=str.length();
        n=n%len;
        return str.substring(n,len)+str.substring(0,n);
    }
}

发表于 2022-08-06 09:46:18 回复(0)
public class Solution {
       public String LeftRotateString(String str, int n) {
        if (n == 0||str==null||str.length()==0) {
            return str;
        }
        StringBuilder stringBuilder = new StringBuilder();
        String val = str + str;
        int len = str.length();
             n = n % len;
        for (int i = n ; i < n  + len; i++) {
            char c = val.charAt(i);
            stringBuilder.append(c);
        }
        return stringBuilder.toString();
    }
}
发表于 2022-07-26 22:07:09 回复(0)
public class Solution {
    public String LeftRotateString(String str, int n) {
        if (str.isEmpty()) {
            return "";
        }
        int m = str.length();
        // n有可能大于m 取模
        n = n % m;
        char[] s = str.toCharArray();
        reverse(s, 0, m - 1);
        reverse(s, 0, m - n - 1);
        reverse(s, m - n, m - 1);
        return new String(s);


    }

    public void reverse(char[] s, int start, int end) {
        while (start < end) {
            swap(s, start++, end--);
        }
    }

    public void swap(char[] s, int a, int b) {
        char temp = s[a];
        s[a] = s[b];
        s[b] = temp;
    }
}

发表于 2022-06-18 14:41:21 回复(0)
import java.util.*;
public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str.length() <= 1){
            return str;
        }
        StringBuilder ans = new StringBuilder(str);
        while (n > 0){
            String s = ans.substring(0,1);
            int end = ans.length();
            ans = new StringBuilder(ans.substring(1,end));
            ans.append(s);
            n--;
        }
        return ans.toString();
    }
}

发表于 2022-05-29 11:31:24 回复(0)
对n取余,通过StringBuffer.append和String.substring得出答案
public class Solution {
    public String LeftRotateString(String str, int n) {
        if (str == null || str.equals("")) {
            return "";
        }
        int length = str.length();
        int trueN = n % length;
        return new StringBuilder().append(str.substring(trueN)).append(str.substring(0, trueN)).toString();
    }
}

发表于 2022-05-26 22:20:50 回复(0)
public class Solution {
    public void revser(char[]chars, int i, int j) {
        while (i < j) {
            char ch = chars[i];
            chars[i] = chars[j];
            chars[j] = ch;
            i++;
            j--;
        }
    }

    public String LeftRotateString(String str, int n) {
        char[]chars = str.toCharArray();
        if (str.length() == 0) return "";
        n = n % str.length();

        revser(chars, 0, n - 1);
        revser(chars, n, str.length() - 1);
        revser(chars, 0, str.length() - 1);
        return new String(chars);
    }
}

发表于 2022-04-11 23:15:26 回复(0)

楼里答案好多感觉都不全啊

public class Solution {

public String LeftRotateString(String str,int n) {
     if(str.length()==0){
        return str;
    }
    if(n>str.length()){
      n=n%str.length();

    }
    String s=str.substring(0,n);
    String s1=str.substring(n,str.length());
    return s1+s;
}

}

发表于 2022-03-29 16:22:19 回复(0)
public class Solution {
    private void reverse(char[] c, int i, int j) {
        // 给下标从i到j的这一段字符都首尾两两交换,这也就起到了反转的效果
        while (i < j) {
            swap2(c, i++, j--);
        }
    }

    private void swap2(char[] c, int i, int j) {
        // 交换字符数组下标i和j的两个字符
        char temp = c[i];
        c[i] = c[j];
        c[j] = temp;
    }

    public String LeftRotateString(String str, int n) {
        if (str.length() == 0 || n == 0) {
            return str;
        }
        if (n >= str.length()) {
            n %= str.length();
        }
        char[] chars = str.toCharArray();
        // 第 n 位置,下标自然是 n - 1
        // 先将 "abc" 
        reverse(chars, 0, n - 1);
        // 再将剩下的反转
        reverse(chars, n, chars.length - 1);
        // 最后把整体反转
        reverse(chars, 0, chars.length - 1);
        return new String(chars);
    }
}

发表于 2022-03-19 11:36:44 回复(0)
public class Solution {
    public String LeftRotateString(String str,int n) {
        // 解法1优化:n取模来避免无用遍历
        
        // 边界
        if(str.length()==0||str==null){
            return "";
        }
        // 取模
        n %= str.length();
        // 创建sb
        StringBuilder sb = new StringBuilder(str);
        // 循环n次,每次左移一位
        while(n>0){
            // 取第一位
            char temp = sb.charAt(0);
            // 删除第一位
            sb.deleteCharAt(0);
            // 添加至最后一位
            sb.append(temp);
            
            n--;
        }
        
        return sb.toString();
        
    }
}

发表于 2022-02-02 15:36:37 回复(0)
java是否应该考虑增补字符啊(doge
    public String LeftRotateString(String str,int n) {
        if (str == null || str.length() == 0) {
            return str;
        }
        int[] strCodePoints = str.codePoints().toArray();
        int length = strCodePoints.length;
        // 移位减去长度倍数
        n %= length;
        if(n <= 0){
            return str;
        }
        // string为不可变对象、每次添加都会重新生成新的字符串 使用StringBuffer线程安全的可变对象增加效率
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < strCodePoints.length; i++) {
            result.append(new String(strCodePoints, (i+n)%length, 1));
        }
        return result.toString();
    }

发表于 2021-12-26 18:09:16 回复(0)
import java.util.*;

public class Solution {
    public String LeftRotateString(String str,int n) {
        LinkedList<Character> linkedlist = new LinkedList<>();
        ArrayList<Character> tempList = new ArrayList<>();
        String res = "";
        if (str.length() == 0)
            return res;
        if (str.length() == n)
            return str;
        int num = 0;
        if (n < str.length()){
            num = n;
        }else{
            num = n % str.length();
        }
        for (int i = 0; i < str.length(); i++){
            linkedlist.add(str.charAt(i));
        }
        for (int j = 0; j < num; j++){
            tempList.add(linkedlist.get(j));
        }
        for (int k = 0; k < num; k++){
            linkedlist.removeFirst();
            linkedlist.add(tempList.get(k));
        }
        for (int i = 0; i < linkedlist.size(); i++){
            res = res + linkedlist.get(i) + "";
        }
        return res;
    }
}

发表于 2021-12-21 22:56:30 回复(0)
public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str.length()==0||str==null) return "";
        StringBuilder sb=new StringBuilder(str);
        for(int i=0;i<n;i++){
            sb.append(String.valueOf(str.charAt(i%str.length())));
        }
        return sb.toString().substring(n,sb.length());
    }
}


发表于 2021-11-30 19:56:12 回复(0)