Java 递归手动方式将正数和负数的int转换为string(没有任何类似数组、列表或解析的东西)

Java 递归手动方式将正数和负数的int转换为string(没有任何类似数组、列表或解析的东西),java,string,recursion,int,Java,String,Recursion,Int,您好,我研究了一个递归方法,以完全手动方式将int转换为字符串,我想知道这个递归方法是否有效,以及您是否可以帮助我改进代码。我是算法新手,所以如果有些东西看起来很难看,不要怪我。。。我在互联网上搜索过,但从未搜索过类似的内容: public class IntToString { public static String intToString(int number) { return intToString(number, "", false); } private static

您好,我研究了一个递归方法,以完全手动方式将int转换为字符串,我想知道这个递归方法是否有效,以及您是否可以帮助我改进代码。我是算法新手,所以如果有些东西看起来很难看,不要怪我。。。我在互联网上搜索过,但从未搜索过类似的内容:

public class IntToString {

public static String intToString(int number) {
    return intToString(number, "", false);
}

private static String intToString(int number, String answer,
        boolean isNegative) {

    if (number < 0 && isNegative == false) {
        isNegative = true;
        number = -number;
    }

    if (number == 0)
        if (isNegative)
            return "-" + answer;
        else
            return answer;

    System.out.println(number);
    return intToString(number / 10, answer = number % 10 + answer,
            isNegative);
}

// test
public static void main(String[] args) {

    String ans = intToString(-324234);
    System.out.println(ans);

}
公共类IntToString{
公共静态字符串intToString(整数){
返回intToString(数字,”,false);
}
私有静态字符串intToString(整数,字符串应答,
布尔值(负){
if(数字<0&&isNegative==false){
isNegative=true;
数字=-数字;
}
如果(数字==0)
如果(为负)
返回“-”+答案;
其他的
返回答案;
系统输出打印项次(编号);
返回intToString(数字/10,答案=数字%10+答案,
阴性);
}
//试验
公共静态void main(字符串[]args){
字符串ans=intToString(-324234);
系统输出打印LN(ans);
}

}不,效率不高。尽管情况可能更糟。至少它仍然是O(N),其中N是给定数字中的小数位数

  • 实际上不需要
    invertInt
    。您之所以使用它,是因为您将它附加到通过递归传递的答案,这将导致该数字被反转。但至少还有两种方法可以做到这一点,这样它就不会被颠倒
  • 如果你注意到,在处理负数和正数的方式之间只有很小的区别。如果您还记得处理负数与处理正数是一样的,那么您可以对这两个数字运行相同的过程,并在完成后固定
    -
  • 没有理由所有的标志都是负数和倒数。这两项工作都是在顶层完成的。因此,您可以在
    intToString(int number)
    函数中执行这些操作,而不是在递归函数中执行这些操作,并节省大量的条件检查,当然还有
    replaceAll()
    调用
  • 无需传递
    答案
    。您可以根据递归调用返回的内容来确定返回值。记住,对于像1,2,3这样的数字,你会得到字符串“1”,“2”,“3”。因此,如果你有23个,并且你传递了2个,你可以使用你得到的
    2
    来构建你的答案
  • 您的算法没有返回0的正确答案。当你以递归的方式思考时,这是正确的答案,但当你用
    0
    main
    调用它时,就不是了。至少有两种方法可以解决这个问题
还有一点风格建议:

  • 始终正确缩进代码
  • 您不需要将布尔值与
    true
    false
    进行比较。如果有一个布尔变量
    x
    ,则可以使用
    If(x)
    If(!x)
    而不是
    If(x==true)
    If(x==false)
    。以更直观的方式命名布尔变量,如
    isNegative
    needsInversion
    。当你阅读时,
    if(isNegative)
    是有意义的

如果您找不到解决方案,请提供更多详细信息:

public static String intToString( int n ) {
    if ( n == 0 ) {
        return "0";
    } else if ( n < 0 ) {
        return "-" + positiveIntToString( -n );
    } else {
        return positiveIntToString(n);
    }
}

private static String positiveIntToString( int n ) {
    if ( n == 0 ) {
        return "";
    } else {
        return positiveIntToString( n / 10 ) + ( n % 10 );
    }
}
我们如何避免倒置?基本上有两种方法。如果你坚持要把答案传下去,那么就不要:

answer += num % 10;
使用:

也就是说,将其附加到答案的左侧,而不是其右侧

我喜欢的方法是使用较低层次的答案。假设你的号码是123。所以你通过12,你得到的答案是“12”。然后你可以用

return answer + ( num % 10 );
这会给你“123”。这一次,它被附加到右边


最后,这里是完整的解决方案:

public static String intToString( int n ) {
    if ( n == 0 ) {
        return "0";
    } else if ( n < 0 ) {
        return "-" + positiveIntToString( -n );
    } else {
        return positiveIntToString(n);
    }
}

private static String positiveIntToString( int n ) {
    if ( n == 0 ) {
        return "";
    } else {
        return positiveIntToString( n / 10 ) + ( n % 10 );
    }
}

我实际上认为这是一个效率较低的解决方案,因为我们对每个级别进行了两次检查。在顶层,负数检查仅为真一次。只有在首先使用零调用函数时,零的检查才会为真。对单个数字的检查是当前递归结束(因为我们不能在零处停止递归,否则我们总是在开始处得到一个额外的“0”)

举一个数字的例子没问题,但是如果你有n个数字?阅读本文:主要目标是从int转换为string,那么为什么要处理n个数字呢?是的,我指的是要转换的实例数(要转换的int的n个数字)好的,谢谢。我会按照你的建议做,并努力提高效率。我改变了你在回复中所说的一切,但我不知道如何防止用模数反转数字,你能帮我吗?谢谢谢谢,效果很好,我只想知道如何防止使用replaceAll。你有没有考虑过如何根据正面的反面从最高层做负面的事情?一旦你这样做了,你将永远不会在递归的答案中有减号。我只是喜欢它的答案=(-number%10)+答案
public static String intToString( int n ) {
    if ( n == 0 ) {
        return "0";
    } else if ( n < 0 ) {
        return "-" + intToString( -n );
    } else if ( n < 10 ) {
        return "" + (n%10);
    } else {
        return intToString(n/10) + (n%10);
    }
}