面接の準備をしていますが、問題の一つを解決することができません。以下は問題です:
組み込みのJava変換関数を使用せずに、数値を取得して1つずつ文字として出力します。以下の例では、1つの数値1234があり、この数値を整数として取得し、文字配列{1,2,3,4}を出力する関数を記述します。
組み込みのJava変換を使用せずにこの関数を作成するように求められました。解決方法を知っている人がいたら教えてください。
面接の準備をしていますが、問題の一つを解決することができません。以下は問題です:
組み込みのJava変換関数を使用せずに、数値を取得して1つずつ文字として出力します。以下の例では、1つの数値1234があり、この数値を整数として取得し、文字配列{1,2,3,4}を出力する関数を記述します。
組み込みのJava変換を使用せずにこの関数を作成するように求められました。解決方法を知っている人がいたら教えてください。
ヒント:
10のモジュロは最後の桁を与えます
整数を10で割ると、最後の桁が削除されます。
数字を1桁ずつ繰り返し、switch-case句を使用して、マップする必要のある文字を決定します。
これはアルゴリズムの一般的な考え方です。結果を出力する代わりに、char配列を作成するように変更してください。
void printNumber(int n) {
if (n < 10)
System.out.println(n);
else {
printNumber(n / 10);
System.out.println(n % 10);
}
}
私は再帰が好きなので、再帰アルゴリズムを使用して作成しました...しかし、これを反復ソリューションに変換するのは簡単です。
制限に完全に従う場合、これはかなり良い演習です。
これが私の解決策です:
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変換関数を使用せずに」に2回違反しています。これは、プログラムを短縮するためだけのものでした。この部分のスイッチを使って関数を書くのは非常に明確で簡単です。
関数は、整数範囲全体に対して有効である必要があります。
しかし正直なところ、就職の面接でこの解決策を10分で実現できるとは思いません。クリーンなコードを書くことで最も効果があり、上記のようなことを避ける方がよい理由について話し合う必要があります。
--tb
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());
}