私はインタビューに参加しました昨日、私は以下の問題の解決策を見つけることができません。 3桁の数字と残りの2,1,4,5桁の数字を持つint配列をソートする方法。配列をソートするためのJavaプログラミング
例:-Inputは
i={1,34,323,456,5432,34566,33,45,654}
出力され、
i={323,456,654,1,34,33,45,5432}
私はインタビューに参加しました昨日、私は以下の問題の解決策を見つけることができません。 3桁の数字と残りの2,1,4,5桁の数字を持つint配列をソートする方法。配列をソートするためのJavaプログラミング
例:-Inputは
i={1,34,323,456,5432,34566,33,45,654}
出力され、
i={323,456,654,1,34,33,45,5432}
私は1つの桁数の順序を変更し、それらを任意の順序で指定できるようにしたいかもしれないと仮定しました。だから私は、処理する必要がある桁数に対応する "ソート"配列を持っています。私はまた、最終配列内で値を昇順にソートする必要があると仮定しました。ソートは実験の一部だと思っていたので、Arrays.sortは使用しませんでした。ここ
アプローチの私のテイクである:
public static void main(String[] args)
{
int[] arr = {1,34,323,456,5432,34566,33,45,654};
int[] sort = {3, 2, 1, 4, 5 };
int lastPos = 0;
int loopPos = 0;
int[] output = new int[arr.length];
// process the whole array
for (int s = 0; s < sort.length; ++s) {
String fmt = String.format("^[0-9]{%d}$", sort[s]);
Pattern pat = Pattern.compile(fmt);
// set to end of the current location
loopPos = lastPos;
for (int i = 0; i < arr.length; ++i) {
int val = arr[i];
Matcher m = pat.matcher(Integer.toString(val));
if (m.matches()) {
// start at the beginning of the loopPos
// continue until lastPos
if (lastPos == loopPos) {
output[lastPos++] = val;
}
else {
for (int ins = loopPos; ins < lastPos; ++ins) {
int atPos = output[ins];
// if we are smaller, must insert before
if (val <= atPos) {
for (int rev = lastPos; rev > loopPos; --rev) {
output[rev] = output[rev - 1];
}
output[ins] = val;
++lastPos;
break;
}
else if (val > atPos) {
output[lastPos++] = val;
break;
}
}
}
}
} //i
} //s
System.out.println(Arrays.toString(output));
}
サンプル結果:
[323、456、654、33、34、45、1、5432、34566]
この私の見て愚かであるが、あなたはこれを行うことができます。
Multipy 3桁長くはないすべての要素をアレイを並べ替えます。 3桁ではないものすべてを1000で割ります。
長さでソートする必要があるため、最初にint[]
をString[]
に変換してください。 Comparator
を使用してString[]
を並べ替えることができます。
ソートするには、最初に長さでソートし、次に値でソートします。あなたの主なソートは長さであるので、値によるセカンダリソートの場合は、単純な文字列の比較で問題ありません。
3、2、1、4、5、6、7、8、9の奇妙な並べ替え順序については、基本的に値1と3を反転しています。つまり、4 - x
1 <= x <= 3
、つまり1,2,3が3,2,1になります。
ここにコードがあります。
public static void sort321(int ... intArray) {
String[] strArray = new String[intArray.length];
for (int i = 0; i < intArray.length; i++) {
if (intArray[i] < 0)
throw new IllegalArgumentException("Negative numbers not allowed: " + intArray[i]);
strArray[i] = Integer.toString(intArray[i]);
}
Arrays.sort(strArray, (s1, s2) -> {
int len1 = (s1.length() <= 3 ? 4 - s1.length() : s1.length());
int len2 = (s2.length() <= 3 ? 4 - s2.length() : s2.length());
int cmp = Integer.compare(len1, len2);
if (cmp == 0) // comment to remove secondary sort
cmp = s1.compareTo(s2); // comment to remove secondary sort
return cmp;
});
System.out.println(Arrays.toString(strArray));
}
TEST
sort321(1,34,323,456,5432,34566,33,45,654);
OUTPUTあなたが期待される結果として示したものではありません
[323, 456, 654, 33, 34, 45, 1, 5432, 34566]
は、しかし、私はこれがあなたが望んでいると信じています。あなたがマークされた行をコメント化二次ソートをドロップすることができ、その場合には、あなたが取得したい:34
と33
が逆転している
[323, 456, 654, 34, 33, 45, 1, 5432, 34566]
。
さて、あなたは指定された結果に近づくために、3次、2、1、4で長さをソートする要件は、...間違っている、とあなたは、単に第一の長さ3を並べ替えることを意図しているかもしれません...
この場合、3を0に変更します。つまり、1,2,3,4が1,2,4,3,2,3,4になります。
また、セカンダリソートを削除すると、表示された結果が表示されますが、それにはまだ番号がありません:34566
。
public static void sort3first(int ... intArray) {
String[] strArray = new String[intArray.length];
for (int i = 0; i < intArray.length; i++)
strArray[i] = Integer.toString(intArray[i]);
Arrays.sort(strArray, (s1, s2) -> Integer.compare((s1.length() == 3 ? 0 : s1.length()),
(s2.length() == 3 ? 0 : s2.length())));
System.out.println(Arrays.toString(strArray));
}
OUTPUT
[323, 456, 654, 1, 34, 33, 45, 5432, 34566]
数字のオーバーフローに注意してください。 – Andreas
私は一番簡単なことをしていました。とにかく、あなたは私の提案が7桁以上の数字にはうまくいかないと思っています。 @アンドレアス –