如何使用二进制数技术对整数的数字进行排序?

时间:2014-11-25 06:02:33

标签: java algorithm sorting binary

昨天我去了一个面试,他们让我创建一个采用整数值的方法,并以数字的降序显示数字。我使用了字符串操作并解决了它,但是他们让我用二进制数技术来完成它。我仍然不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

"二进制数技术"?这是一个废话问题,正确的答案是从面试中走出来,因为它是一个废话公司。

无论如何,我能想到的最佳答案是

public static int solveBullshitTaskInASmartWay(int n) {
    // get characters and sort them
    char[] chars = Integer.toString(n).toCharArray();
    Arrays.sort(chars);
    // comparators don't work in Java for primitives,
    // so you either have to flip the array yourself
    // or make an array of Integer or Character
    // so that Arrays.sort(T[] a, Comparator<? super T> c)
    // can be applied
    for (int i = 0, j = chars.length - 1; i < j; i++, j--) {                                                                                   
        char t = chars[i]; chars[i] = chars[j]; chars[j] = t;
    }
    // reconstruct the number
    return Integer.parseInt(new String(chars));
}   

没有数字方法可以对数字的数字进行排序,如果你期待一个漂亮的数学答案,你会等待一段时间。

编辑:我需要添加这个 - &#34;数字&#34;仅仅是显示数字的属性。它不是数字的属性。在数学上,数字0b10000x80o10008.000008e0(甚至三22相同,如果有人使用三元组;唉,编程中没有传统的符号)。它只是具有数字的数字的字符串表示。在不使用字符或字符串的情况下解决此问题不仅非常困难,而且愚蠢

编辑2:这可能是显而易见的,但是我应该明确表示我对OP没有任何关注,我是采访者,我完全应该负责。

答案 1 :(得分:1)

这是一种简单(但不高效)的方式,无需转换为字符串。您可以使用模数和除法从数字中提取数字,对数字执行插入排序,比较它们,并在需要时进行交换。最多需要9 * 8次比较。 这是C ++中的代码

int sortDigits(int number)
{
    for(int j = 0; j < 9; ++j) //because number can have 9+1 digits (we don't need 10 because digits are sorted in pairs)
    {
        int mul = 1;
        for(int i = 0; i < 8; ++i) //because with i == 7 mul * 10 is biggest number fitting in int (will extract last digit)
        {
            if (mul * 10 > number) break; //by doing that we ensure there will be no zeroes added to number
            int digitRight = number / mul % 10;
            int digitLeft = number / (mul * 10) % 10;
            if(digitRight > digitLeft) //swapping digits
            {
                /*
                 number -= digitLeft * mul * 10;
                 number += digitLeft * mul;

                 number -= digitRight * mul;
                 number += digitRight * mul * 10;
                */
                number -= digitLeft * mul * 9;
                number += digitRight * mul * 9;
            }
            mul *= 10;
        }
    }
    return number;
}