将字符串中的字符向左移动

我是Stack Overflow的新手,我对一个一直在逃避我的编程课有一个实验室问题。 问题要求我们将字符串s的元素向左移动k次。 例如,如果输入是“Hello World”和3,则输出“lo WorldHel”)。 对于非常大的k值,它还必须相对有效地工作。 这是我到目前为止:

String cyclicLeftShift(String s, int k){ String result=""; for(int i=0;i<k;i++){ result = s.substring(1, s.length() - 1) +s.charAt(0); s=result; } return s; } 

我的主要问题是原始字符串的最后一个字符不断被循环的后续迭代覆盖。 我已经尝试了大量的排列,包括将整个事物转换为数组(这违反了原始问题中的效率限制)。 我觉得有一件小事我没有得到,我想知道是否有人可以给我一个正确方向的推动?

谢谢!

你想要的是在位置k处拆分字符串并将两个部分再次合并在一起,但顺序相反。 主要问题是k可能大于或等于字符串的大小。 所以你需要再次将k带入有效范围。

 public static String cyclicLeftShift(String s, int k){ k = k%s.length(); return s.substring(k) + s.substring(0, k); } 

测试方法:

 public static void main(String[] args) { String test = "Hello World"; for(int i = 0; i < test.length()*3; i++) System.out.println(cyclicLeftShift(test, i)); } 

输出:

 Hello World ello WorldH llo WorldHe lo WorldHel o WorldHell WorldHello WorldHello orldHello W rldHello Wo ldHello Wor dHello Worl Hello World ello WorldH llo WorldHe lo WorldHel o WorldHell WorldHello WorldHello orldHello W rldHello Wo ldHello Wor dHello Worl Hello World ello WorldH llo WorldHe lo WorldHel o WorldHell WorldHello WorldHello orldHello W rldHello Wo ldHello Wor dHello Worl 

试试这个我的男孩:

 String cyclicLeftShift(String s, int k) { String result = s.substring(k); for (int i = 0; i < k; i++) { result += s.charAt(i); } return result; } 

也许我错过了一些东西,但是你能不能只用s的长度来修改k来得到n(移位的字符数),然后取[0,n]的子串并将它追加到子串[n,s .length() – 1]?

例如:

 String cyclicLeftShift(String s, int k){ String result=""; int n = k % s.length(); result = s.substring(n) + s.substring(0,n); return result; } 

你可以试试这个:

 public static String cyclicLeftShift(String s, int k){ String result=s; for(int i=0; i 

这是TutorialsPoint的一个例子。 只需单击编译然后执行以查看结果。

String.substring()的参数是(beginIndex,endIndex),NOT(beginIndex,count)。 你需要传递s.length()而不是s.length() – 1 …或者你可以做到其他人发布的更快的方式之一