-1

我想为这个问题实施 Method2 http://www.geeksforgeeks.org/find-two-non-repeating-elements-in-an-array-of-repeating-elements/但我有一个问题。我不知道如何将数组中的数字分成两组(一组在其二进制表示中的指定位置有'1',而那些没有)我认为我必须使用Integer.toBinaryString()数组中的每个数字以下方法:

private static boolean hasOne(int number, int i) {
    String s = Integer.toBinaryString(number);
    if(s.charAt(i) == '1')
        return true;
    return false;
}

但问题是,并非每个数字在其二进制表示中都具有相同的长度,并且该方法无法正常工作。我该如何处理?即我该如何处理填充?

4

3 回答 3

0

它实际上非常接近你所拥有的。假设您正在检查位置的二进制值6。那将是..

0101011
------^

最简单的做法是,在检查值是否为1or之前0,只需检查size二进制字符串的 是否大于索引。

if(s.length() <= i) {
    return false;
}
于 2014-07-07T15:31:37.217 回答
0

由于您在执行显式转换为二进制并在那里找到设置位的额外步骤时遇到了麻烦,只需知道提供的代码仅移植到 java,因为它主要是按位运算:

public static void main (String[] args)
{
    int arr[] = {2, 3, 7, 9, 11, 2, 3, 11};
    int xor = 0;
    for (int i = 0; i < arr.length; i++) {
        xor ^= arr[i];
    }
    int set_bit_no = xor & ~(xor-1);
    int x = 0, y = 0;
    for (int i = 0; i < arr.length; i++) {
        if ((arr[i] & set_bit_no) != 0) {
            x ^= arr[i];
        } else {
            y ^= arr[i];
        }
    }
    System.out.println(x); // prints 7
    System.out.println(y); // prints 9
}
于 2014-07-07T15:48:02.247 回答
0

String.format首先,您可以使用和的组合填充二进制字符串replace

String s = String.format("%32s", Integer.toBinaryString(number)).replace(' ', '0');

您还可以使用按位运算符来确定给定数字的二进制表示是否在某个位置具有 1。

例如,考虑十进制数x = 20,它是10100二进制的。进一步假设您要确定二进制数在右数第三个位置是否为 1 n = 3。您可以使用>>位移将二进制序列向右移动两次n - 1,然后&用 1 对其进行屏蔽。

结果表达式看起来像(20 >> 2) & 1,如果右边第三个位置确实有 1,则计算结果为 1,如果没有,则计算结果为 0。在这种情况下,它的计算结果为 1。

因此,您可以将其进一步概括为:

private static boolean hasOne(int number, int i) {
    return ((number >> (i - 1)) & 1) == 1;
}

您可以在Java 教程中了解有关按位和位移运算符的更多信息。

于 2014-07-07T15:49:46.017 回答