我需要获取一个字符串并通过获取char来重新排列它,并且通过该char我必须将字符串上的所有字符串移动到最后 喜欢" Hello world!" '升' => " Heo word!lll" 我有问题强调递归思维方式 所以我从这开始:
public static String ChToLast (String str, char ch){
if(str.indexOf(ch)== -1){
return str;
}else{
if(str.indexOf(0) == ch){
return str;
}
}
谢谢你的帮助:)
答案 0 :(得分:2)
递归是在自身内部重用方法的做法。在这种情况下,我将提供解释发生情况的解决方案:
public static String chrToLast(String str, char ch) {
//This if statement details the end condition
if(str.length() < 1) {
return "";
}
String newString = str.substring(1); //Create new string without first character
if(str.indexOf(ch) == 0) { //This happens when your character is found
return chrToLast(newString, ch) + ch;
} else { //This happens with all other characters
return str.charAt(0) + chrToLast(newString, ch);
}
}
如果您执行:
chrToLast("Hello, World!", 'l')
这将产生所需的结果:Heo, Word!lll
<强>过程强>
通常,此方法通过检查当前哪个字符在给定字符串中的第一个字符,然后决定要执行的操作来工作。如果第一个字符与您要查找的字符(l
)相同,则会从字符串中删除该字符,并在新字符串上使用chrToLast
。但是,它还使用+ ch
添加了在结果末尾找到的字符。它会继续这样做,直到没有剩下的字符,这就是结束条件的用途。
结束条件
结束条件返回一个空字符串""
,因为这就是算法的基本情况。您可以将递归算法视为通过多次调用自身来解决问题的方法。通过自称,递归算法转向 base 。在这种特殊情况下,它通过每次执行方法时从字符串中减去一个字符来实现。一旦没有剩下的字符,它就会到达""
的基本情况,其中字符串最后为空,不再可以减去任何字符。 (因此它没有返回任何内容,因为它是最终状态)
我希望这能回答你的问题。理解这个概念很重要,因为它非常强大。如果某些事情不明确,请尝试研究代码和评论。
通过在IDE中执行此代码并使用调试器来完成其执行,也可以提供帮助。然后,您可以自己查看程序的流程,并查看正在运行的变量的值。
答案 1 :(得分:0)
如果使用递归,那么对于您期望的结果来说,这将是非常昂贵的调用。很多String或charArray元素的移动,无论如何。我不认为这是一个更明智的选择。我会这样做,它将是空间复杂度O(2n)&amp;性能复杂度O(n)。
public class Solve {
public static void main(String[] args) {
System.out.println(ChToLast("Hello world!", 'l'));
}
public static String ChToLast(String str, char ch) {
char[] chars = str.toCharArray();
char[] modChars = new char[chars.length];
int i = 0;
for(char element : chars){
if(ch != element){
modChars[i++] = element;
}
}
Arrays.fill(modChars, i, chars.length , ch);
return new String(modChars);
}
}
答案 2 :(得分:0)
如果您使用 while循环 并编写一个方法来检查该字符串是否意味着完美陈述那么这可能对您有用 在这里你需要一些NLP概念的帮助,以便每次检查被安排的字符是否有任何陈述或语法正确。 这将有助于