在一个大数组中有且仅有两个数相同,怎样尽快找出这两个数(未完成)

//采用位图的方法,如果是在一个1000万大的数组中,其中只有两个数是相同的,可以在O(n)时间复杂度内找出相同的数
//数组b是一块连续内存区域,用数组中的每一bit表示一个数是否存在,1表示存在,0不存在,比如,给定一个数字1025,
//那么,就把b数组的第1025bit置为1,基本思想就是用数组内存的一个bit所在的下标值作为数据数值,而不用真正去储存这个值,用下标作为值,节省空间。
//因为操作系统内存最小操作单位是字节,所以不能直接操作bit,因此,首先,必须找到第1025bit所在的字节,就是1025/8(因为下标是从0开始,整除截断的无关紧要,下步用到),
//然后再找出1025在该字节的哪一bit,就是1025%8=1,整个意思就是,1025在b数组的第1025/8个字节的第1 bit中,然后用&操作访问该bit是否为1,为1则表明1025存在了.
#include <stdio.h>
int a[3]={1,10000000,10000000};
//char类型为8位,共需要10000000/8个char
static unsigned char b[10000000/8+1];
int i;
void main() {
    for (i=0;i<3;i++) {
		//1<<(a[i]%8)表示1左移余数的位数即为a[i]在b中对应的位,例如1024%8=0,然后1<<0=1(二进制止:00000001),所以1024在b数组的第1024/8个字节的第1 bit中;
		//1025%8=1,然后1<<1=2(二进制:00000010),所以1025在b数组的第1025/8个字节的第2 bit中;1026%8=2,然后1<<2=4(二进制:00000100),所以1026在b数组的第1026/8个字节的第3 bit中;以次类推
        if (b[a[i]/8]&(1<<(a[i]%8))) break;
        else b[a[i]/8]|=(1<<(a[i]%8));
    }
    if (i<3) printf("%d\n",a[i]);
    else     printf("Can not find.\n");
	printf("%d\n",1<<(1024%8));
	printf("%d",5);
}


在Java中,你可以创建一个简单的类,利用属性接收个整数,并通过条件语句检查它们是否包含负数。同时,你可以通过比较运算符找出较大的那个数。下面是一个示例: ```java public class NumberComparator { private int num1; private int num2; // 构造函数接受个整数作为输入 public NumberComparator(int num1, int num2) { this.num1 = num1; this.num2 = num2; } // 检查是否有负数并找到较大数 public void checkAndFindMax() { boolean hasNegative = false; if (num1 < 0) { System.out.println("Number 1 is negative."); hasNegative = true; } if (num2 < 0) { System.out.println("Number 2 is negative."); hasNegative = true; } // 如果没有负数,直接比较大小 if (!hasNegative) { if (num1 > num2) { System.out.println("The larger number is " + num1); } else { System.out.println("The larger number is " + num2); } } else { // 否则,计算绝对值再比较 int absNum1 = Math.abs(num1); int absNum2 = Math.abs(num2); if (absNum1 > absNum2) { System.out.println("The larger absolute value is " + num1); } else { System.out.println("The larger absolute value is " + num2); } } } } // 使用示例 public static void main(String[] args) { NumberComparator comparer = new NumberComparator(5, -3); comparer.checkAndFindMax(); } ``` 在这个例子中,`checkAndFindMax`方法首先会检查每个数是否小于零,然后如果没有负数,直接比较`num1`和`num2`;如果有负数,则先取数的绝对值后再比较。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值