Java 在字符串中移动字符 stringnewstr; 公共随机变量(字符串输入){ newStr=输入; } 公共无效移位chars(){ char[]oldChar=newStr.toCharArray(); char[]newChar=newChar[oldChar.length]; newChar[0]=oldChar[oldChar.length-1]; for(int i=1;i

Java 在字符串中移动字符 stringnewstr; 公共随机变量(字符串输入){ newStr=输入; } 公共无效移位chars(){ char[]oldChar=newStr.toCharArray(); char[]newChar=newChar[oldChar.length]; newChar[0]=oldChar[oldChar.length-1]; for(int i=1;i,java,arrays,string,char,Java,Arrays,String,Char,我创建了一个将字符向前移动1的方法。例如,输入可以是: 输入:Stackoverflow 输出:wStackoverflo 我是如何变异字符串的一个实例的。将该字符串转换为char数组(称之为oldChar),将oldChar的最后一个索引指定为newChar的第一个索引,并创建一个for循环,将oldChar的第一个索引指定为我的新char数组的第二个索引,依此类推。最后,我将char数组转换回字符串 我觉得我做了太多太简单的事情。有没有更有效的方法来做这样的事情 编辑感谢您的伟大的答案 你可

我创建了一个将字符向前移动1的方法。例如,输入可以是:

输入:
Stackoverflow

输出:
wStackoverflo

我是如何变异字符串的一个实例的。将该字符串转换为
char
数组(称之为
oldChar
),将
oldChar
的最后一个索引指定为
newChar
的第一个索引,并创建一个for循环,将
oldChar
的第一个索引指定为我的新
char
数组的第二个索引,依此类推。最后,我将char数组转换回字符串

我觉得我做了太多太简单的事情。有没有更有效的方法来做这样的事情


编辑感谢您的伟大的答案

你可以让你的生活更简单:

String newStr;

public RandomCuriosity(String input){
    newStr = input;
}

public void shiftChars(){
    char[] oldChar = newStr.toCharArray();
    char[] newChar = new char[oldChar.length];
    newChar[0] = oldChar[oldChar.length-1];
    for(int i = 1; i < oldChar.length; i++){
        newChar[i] = oldChar[i-1];
    }
    newStr = String.valueOf(newChar);
}
您可以使用:


您可以使用StringBuilder

newStr = newStr.charAt(newStr.length() - 1) + newStr.substring(0, newStr.length() - 1);
试试这个

StringBuilder strb = new StringBuilder();
strb.append(oldChar[oldChar.length-1]).append(oldchar.substring(0, oldChar.length-1));
newStr = strb.toString();

通过Java,u可以按O(n)将其向前移动,其中n是按字符向前移动的次数,该字符是哪个空间O(1)

公共静态字符串移位chars(字符串s,整数倍){
字符串温度=s;
for(int i=0;i
另一种解决方案,但不使用循环,用于左右换档:

public static String shiftChars(String s , int times) {
    String temp = s;
    for (int i = 0; i < times ; i++) {
        temp =  temp.charAt(temp.length()-1)+temp.substring(0, temp.length()-1);
    }
    return temp;
}

你的程序的时间和空间复杂度是多少?我不知道,尽管我认为它相当高。这似乎是离题的,因为它应该打开:@SotiriosDelimanolis子字符串解决方案实际上更快吗?我不知道子串是否产生O(1)?如果我没记错的话,java的新版本不再有偏移量了。您创建了一个具有类似但已更改的值的新字符串。字符串是不可变的。哇。这是一个激烈的一行。所以让我直说吧。您将最后一个索引视为字符,将最后一个索引之前的字符视为完整字符串?是的。但是,如果您觉得第一个操作数更清楚,您也可以使用
newStr.substring(newStr.length()-1)
作为第一个操作数。这是一个非常漂亮的解决方案,并且非常好地使用了内置Java方法。谢谢JB。@JB你能检查一下我对这个问题的最后一点评论吗?你能评论一下我对复杂性的看法是否正确吗?只是更正代码行。第二个
newStr.length中缺少
()
。将是:
newStr=newStr.charAt(newStr.length()-1)+newStr.substring(0,newStr.length()-1)您的解决方案与JB Nizet接受的答案相同。这无关紧要。事实上,我只是想和大家分享一下我是如何使用这段代码来解决我的问题的,谢谢你关注这段代码^ ^不过你的答案可能会被删除。我们的想法是发布不同的答案。
newStr = newStr.charAt(newStr.length() - 1) + newStr.substring(0, newStr.length() - 1);
StringBuilder strb = new StringBuilder();
strb.append(oldChar[oldChar.length-1]).append(oldchar.substring(0, oldChar.length-1));
newStr = strb.toString();
        String old = "String";
        char first = old.charAt(old.length()-1);
        String newString = first+old.substring(0,old.length()-1);
        System.out.println(newString);
public static String shiftChars(String s , int times) {
    String temp = s;
    for (int i = 0; i < times ; i++) {
        temp =  temp.charAt(temp.length()-1)+temp.substring(0, temp.length()-1);
    }
    return temp;
}
public static String cyclicLeftShift(String s, int n){ //'n' is the number of characters to shift left
        n = n%s.length();
        return s.substring(n) + s.substring(0, n);
    }
      
public static String cyclicRightShift(String s, int n){ //'n' is the number of characters to shift right
        n = n%s.length();
        return  s.substring(s.length() - n , s.length()) + s.substring(0, s.length() - n);
    }