一道绝妙的查找题

本文介绍了一个在特定规则下生成数组并查找数组中首次出现目标数值位置的算法实现,包括数组生成方法、查找算法及其实验代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间在网上看到这么一个数字查找题,觉得挺有意思的,在此记录一下 。 大意是这样描述的:

有一个整型数组,它相邻两个元素只差的绝对值为 1 ,如: 7,8,9,10,11,10,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4.....  现在要查找一个数 number , 请找出number在数组中第一个出现的位置 。

其它的方法就不多说了, 下面讲一下一个比较 “另类”的解法。

数组第一个元素的值为array[0]  , 利用数组绝对值差为 1 的特性 ,如果number != array[0] , 则在array[0]  ~~ array[ | number - array[0] | ] 之间的数都是比number 大 或者比number小的数 , 也就是说number最有可能出现的位置是    i  =  |number - array[0] |  , 如果 number != array[i] , 则下一个最有可能出现的位置是 j = | number - array[i] |  ...... 以此类推。 如果找到相等的数,则返回该数在数组中的位置  position , 否则 返回 -1 。

下面是个简单的实现:

生成一个满足该规则的指定长度的数组

public static int[] genArrayData(int length) {
        int[] data = new int[length];
        Random r = new Random();
        int key = length * 4 ;
        data[0] = r.nextInt(key);
        for (int i = 1; i < length; i++) {
            data[i] = data[i - 1] + (r.nextInt(key) > data[i - 1] ? 1 : -1);
        }
        return data;
    }


查找number在数组中第一次出现的位置:

public static int findNumInArray(int[] sour, int value) {
        if (sour == null || sour.length == 0)
            return -1;
        int count = 0;
        for (int i = 0; i < sour.length; i += Math.abs(value - sour[i])) {
            System.out.println("compute time : " + ++count);
            if (sour[i] == value)
                return i;

        }
        return -1;
    }

测试代码:

public static void main(String[] args) {
        	s_sour_data = genArrayData(10000000);
        	for (int i = 0; i < s_sour_data.length; i++) {
            		System.out.print(s_sour_data[i] + "  ");
            		if(((i+1)%100) == 0)
                		System.out.println();
        	}
        	System.out.println();
       	 	System.out.println(findNumInArray(s_sour_data, 10989));
    	}


对于该问题就先写到这里了,若有不足,以后再做补充 ~_~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值