1

我正在准备面试,但我无法解决其中一个问题。下面是问题:

不使用任何内置的java转换功能,将数字一个一个地打印为字符。下面的示例假设您有一个数字 1234,现在编写函数将此数字作为整数并打印字符数组 {1,2,3,4}。

它要求在不使用任何内置 java 转换的情况下编写此函数 如果有人知道如何解决它,请告诉我。

4

5 回答 5

8

暗示 :

模数 10 给出最后一位

整数除以 10 会删除其最后一位。

于 2012-10-25T20:01:04.027 回答
2

逐位遍历数字并使用 switch-case 子句来决定必须将其映射到哪个字符。

于 2012-10-25T19:58:06.777 回答
1

这是算法的大致思路,修改它以创建一个 char 数组而不是打印结果:

void printNumber(int n) {
    if (n < 10)
        System.out.println(n);
    else {
        printNumber(n / 10);
        System.out.println(n % 10);
    }
}

我使用递归算法编写它,因为我喜欢递归......但是将其转换为迭代解决方案很简单。

于 2012-10-25T20:01:06.047 回答
0

如果我们完全遵守限制,这是一个相当不错的练习。

这是我的解决方案:

static char[] getCharArrayFromInt(int value) {
    if (value == 0)
        return new char[]{'0'};
    if (value == Integer.MIN_VALUE)
        return new char[]{'-', '2', '1', '4', '7', '4', '8', '3', '6', '4', '8'};
    int signValue = 0;
    if (value < 0) {
        signValue = 1;
        value *= -1;
    }
    char[] result = new char[signValue + (int) (Math.log10(value) + 1)];
    // to be correct, we need a switch/function here. but for the length, lets reduce it
    if (signValue == 1)
        result[0] = '-';
    for (int i = result.length - 1; i >= 0 + signValue; --i) {
        result[i] = (char) ((value % 10) + '0');
        // to be correct, we need a switch here. but for the length, lets reduce it
        value /= 10;
    }
    return result;
}

它两次违反了“不使用任何内置的java转换函数”,在源代码中标记。这只是为了缩短程序。为这部分编写一个带有开关的函数非常清晰易懂。

这些函数应该对整个整数范围有效。

但老实说,我不认为一个人可以在面试的 10 分钟内做出这个解决方案。你应该开始讨论编写干净的代码是最有回报的,以及为什么最好避免上面显示的这些事情。

--待定

于 2012-10-25T20:49:11.470 回答
0
public static void main(String[] args) {
    final int number = 500;
    final int base = 10; // the number system, in your case: decimal
    int tmp = number; // create a temporary variable for processing
    StringBuilder sb = new StringBuilder(); // create a buffer for your textual representation (or calc the length beforehand)
    //
    do {
        int digit = tmp % base; // get the last digit
        sb.append(digit); // attach it to your character buffer
        tmp /= base; // remove the numbers last digit
    } while (tmp != 0); // stop when there is no more character but when the number is 0, you have to execute it once
    sb.reverse(); // now flip the characters because it was written to from behind
    //
    String numText = sb.toString();
    System.out.println(numText);
    //
    char[] chars = numText.toCharArray();
    sb = new StringBuilder("{");
    for (int i = 0; i < chars.length; i++) {
        char c = chars[i];
        sb.append(c);
        if (i != chars.length - 1) {
            sb.append(", ");
        }
    }
    sb.append("}");
    //
    System.out.println(sb.toString());
}
于 2012-10-25T20:14:15.337 回答