一种快速找数的方法

今天看一个博客看到一中找数的方法,感觉很有意思,就自己理解了下然后写了份代码...

题目的意思是这样的:对一个相邻元素的差的绝对值都为1的一个数组,找出某个元素是否在其中出现过,若出现过的话打印它的一个下标,否则提示没找到。

我们先来理解下,首先,相邻元素的差的绝对值为1,那么某个元素 n 和第一个元素 array[0] 的下标的差不大于 index = |n - array[0]|,如果下标位置index没找到元素,那么继续 index += |n - array[index]|,也就是从原index继续向下|n - array[index]|个位置,因为此时 n 和 array[index]的位置差最少也为|n - array[index]|。如此下去最终可以找到元素。这样就可以跳跃性地去查找元素而不是一个一个遍历。但这里要注意的是,相邻元素之差的绝对值应该为1.最起码来说不能大于1,可以为0,但是为0的话这个算法的效果就没那么明显了。

下面是程序:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cmath>
 4 
 5 using namespace std;
 6 
 7 int findNumber(int* arrayL, int len, int numberToFind) {
 8     int index = abs(numberToFind - arrayL[0]);
 9     
10     //如果没找到就继续下一个遍历
11     while (index < len) {
12         if (arrayL[index] == numberToFind)
13             return index;
14 
15         index += abs(numberToFind - arrayL[index]);
16     }
17     //代表没有找到
18     return -1;
19 }
20 
21 int main(int argc, char const *argv[])
22 {
23     int lenOfArray;
24     int* arrayL;
25 
26     printf("Enter the length of the array: ");
27     scanf("%d", &lenOfArray);
28 
29     arrayL = new int[lenOfArray];
30     printf("Enter the elements of the array: ");
31     for (int i = 0; i != lenOfArray; i++)
32         scanf("%d", &arrayL[i]);
33 
34     int numberToFind;
35     printf("Do you want to find a number<Y, N>? ");
36     char command;
37     while (scanf("\n%c", &command) && 
38                 (command != 'n' && command != 'N')) {
39         printf("Enter the number you want to find: ");
40         scanf("%d", &numberToFind);
41 
42         printf("The index of the number you want to find: %d\n",
43                      findNumber(arrayL, lenOfArray, numberToFind));
44 
45         printf("find another number?<Y, N> ");
46     }
47 
48     delete []arrayL;
49     return 0;
50 }

 

posted @ 2013-11-26 00:18  厕所门口~~  阅读(388)  评论(0编辑  收藏  举报