我是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;
}
我的主要问题是原始字符串的最后一个字符会被循环的后续迭代所覆盖。我已经尝试了大量的排列,包括将整个事物转换为数组(这违反了原始问题中的效率限制)。我觉得有一件小事我没有得到,我想知道是否有人可以给我一个正确方向的推动?
谢谢!
答案 0 :(得分:4)
您想要的是将字符串拆分到位置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
答案 1 :(得分:1)
试试这个我的男孩:
public static String cyclicLeftShift(String s, int k){
String result=s;
for(int i=0; i<k; i++){
result = result.substring(1) + result.charAt(0);
}
return result;
}
答案 2 :(得分:1)
答案 3 :(得分:1)
也许我错过了一些东西,但你能不能只用s的长度来修改k来得到n(要转移的字符数),然后取[0,n]的子串并将它追加到substring [n,s.length() - 1]?
e.g:
Dim itemsToMove = lb1.Items.ToList()
For Each item in itemsToMove
lb1.Items.Remove(item)
lb2.Items.Add(item)
Next
答案 4 :(得分:0)
String.substring()的参数是(beginIndex,endIndex),NOT(beginIndex,count)。你需要传递s.length()而不是s.length() - 1 ...或者你可以用其他人发布的更快的方式之一来实现
答案 5 :(得分:0)
不确定此解决方案是否有帮助!但这对我有用:)好吧,您可以尝试一下!
class Main {
public static void main(String[] args) {
System.out.println("Moving left by n characters");
String str1 = moveCHaracters("Hellow World", 4);
System.out.println(str1);
}
public static String moveCHaracters(String s, int k) {
String result = s.substring(s.length() - (k));
int length = s.length() - k;
if (k > 0) {
for (int i = 0; i < length; i++) {
result = result + s.charAt(i);
}
}
return result;
}
}
答案 6 :(得分:0)
一种快速的解决方案,只需要注意要移动的 val 一定不能超出OutOfBounds。
String shiftLeft(String inp, int val)
{
String shifted_str="";
shifted_str=inp.substring(val);
shifted_str+=inp.substring(0,val);
return shifted_str;
}