用不同增量号搜索的java算法

时间:2018-07-27 13:27:47

标签: java algorithm oop

我有下一个数据: data

在Java Whet上需要创建算法将根据输入值返回结果 例如:

  1. 从1到7的任何值都必须返回0
  2. 从38到52返回3
  3. 如果输入将为40,则结果为3
  4. ......

    我不预先知道数据,我只知道他们填充的算法

我已经开始使用下一个代码:

 public int getAmountOfUnits(int duration ) {
if (duration >= 1 && duration <= 7) return 0;
if (duration >= 8 && duration <= 82) {}
return 1;

}

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

这是使用Arrays.binarySearch的解决方案,

static int indexInRanges(int[] rangeEndPoints, int value) {
    int bsPos = Arrays.binarySearch(rangeEndPoints, value);
    if (bsPos < 0)
        return ~bsPos;
    else
        return bsPos;
}

// test code
public static void main (String[] args) throws java.lang.Exception
{
    int[] rangeEndPoints = { 7, 22, 37, 52, 67, 82, 90, 114, 138, 162, 186, 210, 234, 258, 282, 306, 330, 354 };
    System.out.println("1 -> " + indexInRanges(rangeEndPoints, 1));
    System.out.println("40 -> " + indexInRanges(rangeEndPoints, 40));
    System.out.println("350 -> " + indexInRanges(rangeEndPoints, 350));
}

此代码不会尝试处理更一般的情况,例如:

  • 除简单索引以外的其他输出值(但您可以为此使用一个额外的数组)
  • 范围列表中的空白
  • 任何范围内都不包含输入值

或者,您可以将if < 0等事物写为return bsPos ^ (bsPos >> 31),但要以降低其作用为代价。

作为一种特殊情况,由于您的大多数范围都是相同的大小,因此您可以仅通过几个if/else情况和某些划分来破解某些内容,但是这会用特别困难的方式对范围列表进行硬编码改变方式。

答案 1 :(得分:0)

有多种方法可以完成此任务。这是一种简单的算法。

import java.util.Scanner;

class search{
  public static void main(String a[]){

    Scanner sc=new Scanner(System.in);
    System.out.print("Enter  Value :");
    int value=sc.nextInt();

    System.out.print("Enter increment value :");
    int increment=sc.nextInt();

    int i;
    int counter=0;int c=0;

    int[] result={1,8,23,38,53,68,83,91,115,139,163,187,211,235,259,283,307,331};

    for(i=0;i<result.length;i++){
        counter++;
        if(value<=(result[i]+increment)){
            System.out.print("result is :" + (counter-1));
            counter=0;
            c++;
            break;
        }
    }   
    if(c==0){
        System.out.print("Not found!");
     }  

  }

}