返回字符串的scanner对象中的数字的反向顺序(java)

时间:2015-09-30 10:51:48

标签: java recursion java.util.scanner reverse

我有一个任务的主要清理工具,我真的迷失了如何去做。作业如下:

在Java公共静态字符串反向(扫描程序扫描)中编写递归方法,扫描程序对象包含数字,并且数字应该以相反的顺序作为字符串返回。这里是棘手的部分,你不允许使用数组,列表或字符串,它只是假设声明一个变量。

反向输入(例如新扫描仪(“20 33 40”)应该返回: “40 33 20”。

如果不是因为束缚,我会知道如何去做。我真的不知道我怎么想解决这个问题。我在编程方面很陌生,我知道有些人反对帮助完成任务,我会很感激任何指针。

5 个答案:

答案 0 :(得分:1)

第一种可能性使用字符串

您可以直接使用String作为数据结构。当您阅读新号码时,在开头添加而不是在结尾

基本上使用如下代码:

String str = "";
while (yourcondition) {
    str = scanner.nextInt() + " " + str;
}
return str;

第二种可能性使用StringBuffer或StringBuilder

StringBuilder str = new StringBuilder();
while (yourcondition) {
    str.insert(0, " ").insert(0, scanner.nextInt());
}
return str.toString();

第三种可能性使用递归:

public String read(String str, Scanner scanner) {
    if (testExitCondition) {
        return str;
    }
    return scanner.nextInt() + " " + str;
}

// Called with System.out.println(read("", scanner));

注意

第一个解决方案使用String创建许多String实例,但只有一个引用它。

第二种解决方案使用内部使用数组操作字符串的现有类。

第三个向JVM提供对创建的String的引用,因此代码中不存在对字符串的显式引用。这是唯一没有显式变量声明的东西(仅在方法签名中,而不在外部)。

答案 1 :(得分:1)

您可以将scanner.hasNext()while循环一起使用。使用StringBuilder收集预付费数据。

    Scanner scanner = new Scanner("12 52 10");

    StringBuilder builder = new StringBuilder();
    while (scanner.hasNext()) {
        builder.insert(0, scanner.next()).insert(0, " ");
    }
    builder.replace(0, 1, "");
    System.out.println(builder.toString());

答案 2 :(得分:0)

在你的限制中,你得到结果然后以相反的顺序输出字符串。

public static void main(String[] args) {
    Scanner scanner = new Scanner("20 33 40");
    System.err.println(scan(scanner));
}

public static String scan(Scanner scanner) {
    if (scanner.hasNext()) {
        String next = scanner.next();
        String result = scan(scanner);
        return result.isEmpty() ? next : result + " " + next;
    }
    return "";
}

答案 3 :(得分:0)

编写递归方法是每个编程学校必须学习的东西。技术总是一样的:

  1. 检查是否已达到结束条件并返回初始值(在数学中我们说的是中性元素)。

  2. 拆分输入的某些部分,使用remainingig输入调用递归方法,然后使用先前拆分的部分汇总该调用的结果。

  3. 根据该常用算法,您必须以这种方式实现您的方法:

    public static String reverse(Scanner scan) {
        if (scan.hasNextInt()) { // check whether to continue or not
            int number = scan.nextInt(); // split part
            return reverse(scan) + " " + number; // assemble this part and the rest
        } else {
            return ""; // return an initial or base value (the neutral element)
        }
    }
    

    必须在调用递归之前调用scan.nextInt(),否则下一个数字将不会被拆分。

答案 4 :(得分:0)

你只需要指针......

您必须编写一个递归函数String reverse(Scanner scanner),它以相反的顺序返回数字。这个任务的重点是让你进行grok递归,这可能就像向后思考一样。

您在reverse()功能的第一次运行中通过了扫描程序,其中包含以下内容:

"20 33 40"

因此,从扫描仪中读取一个整数:

int value = scanner.readInt();

您的字段value将包含整数20,而扫描程序对象现在似乎只包含此字段:

"33 40"

所以,假设你有一个反向函数可以输出" 40 33"然后你可以将value粘贴在它后面并获得" 40 33 20"。

递归假装你的函数已经做了它应该做的事情并用你输入的较小版本调用自己,直到你得到了琐碎的版本。您的第一个电话是" 20 33 40",第二个电话是" 33 40",第三个电话" 40"最后用""。

你传入的最后一个电话""简单。您只需检查并返回""。

其他电话也不是那么难。您只需读取一个int,并将其与递归调用的输出粘贴到reverse