【问题标题】:recursion moving char to the end of the string递归将 char 移动到字符串的末尾
【发布时间】:2018-11-05 07:19:13
【问题描述】:

我需要获取一个字符串并通过获取 char 并通过该 char 递归重新排列它,我必须将该字符串上的任何位置移动到末尾 比如“你好世界!” ,'l' => "嘿嘿!lll" 我在理解递归思维方式时遇到问题 所以我从这个开始:

public static String ChToLast (String str, char ch){
    if(str.indexOf(ch)== -1){
        return str;
    }else{
        if(str.indexOf(0) == ch){
            return str;
        }
    }

谢谢你的帮助:)

【问题讨论】:

  • 你能解释一下你必须做什么吗?我还不是很清楚。
  • 递归基本上有两个主要部分。一,是你的结束条件。你什么时候需要递归停止。二是你的继续条件,该方法什么时候需要调用自己?
  • @NocNit 从字符串中挑选一个字符,并将所有出现的字符移到字符串的末尾。
  • 该函数假设采用单个字符串和一个字符,并使用递归 @NocNit 将我们选择的每个字符移动到字符串的末尾谢谢您的时间
  • 如果我的回答解决了您的问题,请将其标记为已接受。也帮了我很多忙;)

标签: java string recursion


【解决方案1】:

递归是在自身内部重用方法的实践。在这种情况下,我将提供一个解决方案来解释发生了什么:

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 中执行此代码并使用调试器来遍历其执行过程也有帮助。然后您可以自己查看程序的流程是什么,并查看正在运行的变量的值。

【讨论】:

  • 为什么在结束条件返回空字符串?
  • 它这样做是因为没有字符可以返回了。它多次执行该函数,每次删除字符串的第一个字符:Hello World! -> ello World! -> 等。一旦字符串为空,它需要停止。因此,它不会继续,而是立即返回一个空字符串。
  • 更新了我的答案以添加有关结束条件的信息。
【解决方案2】:

如果您使用递归,那么调用您所期望的结果将会非常昂贵。无论如何,您都需要大量移动 String 或 charArray 元素。我不认为这是一个更明智的选择。我会这样做,空间复​​杂度 O(2n) 和性能复杂度 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);
}   
}

【讨论】:

    【解决方案3】:

    如果您使用 while 循环 并编写一个方法来检查该字符串是否意味着完美的语句,那么这可能对您有用 在这里,您需要 NLP 概念的一些帮助来检查排列的字符是否正在做出任何陈述或语法正确。 这会有所帮助

    【讨论】:

    • 我是个新手,对 NLP 概念做一些研究,谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2013-08-25
    • 2018-02-25
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多