• Algs4-1.1.29等值键


    1.1.29等值键。为BinarySearch类添加一个静态方法rank(),它接受一个键和一个整型有序数组(可能存在重复键)作为参数并返回数组中小于该键的元素数量,以及一个类似的方法count()来返回数组中等于该键的元素的数量。注意:如果i和j分别是rank(key,a)和count(key,a)的返回值,那么a[i...i+j-1]就是数组中所有和key相等的元素。
    import java.util.Arrays;
    public class BinarySearch
    {
    public static void main(String[] args)
        {
            int[] whitelist=In.readInts(args[0]);
            Arrays.sort(whitelist);
            while (!StdIn.isEmpty())
            {
                int key=StdIn.readInt();
                StdOut.printf("small "+ Integer.toString(key) + " num=%d ,count=%d",rank(key,whitelist),count(key,whitelist));
            }  
        }//end main

        public static int rank(int key,int[] a)
        {
            int smallCount=findSmallKeyIndex(key,a);
            if (smallCount<1) return 0;
            else return smallCount;
        }//end rank
       
        public static int count(int key,int[] a)
        {
            int smallKeyIndex=findSmallKeyIndex(key,a);
            int bigKeyIndex=findBigKeyIndex(key,a);
            if (smallKeyIndex==-1) return 0;
            else  return bigKeyIndex-smallKeyIndex+1;
        }//end count
       
        public static int findSmallKeyIndex(int key,int[] a)
        {
            int indexOfKey=findKeyIndex(key,a);
            //key's index is 0 or -1 then no one is  small   than the key.
            if (indexOfKey==-1 )
                return -1;
            else if(indexOfKey==0)
                return 0;
            else //(indexOfKey>0)
            {
                indexOfKey--; 
                //find to 0
               while (indexOfKey>=0 && a[indexOfKey]==key)    indexOfKey--;
               if (indexOfKey>0)  return indexOfKey+1;
               else if(indexOfKey==0 && a[indexOfKey]<key) return indexOfKey+1;
               else//(indexOfKey==0 && a[indexOfKey]==key)
               return 0;
            } 
       }//end findSmallKeyIndex
       
        public static int findBigKeyIndex(int key,int[] a)
        {
            int indexOfKey=findKeyIndex(key,a);
            //not found or found the last then no one is big than the key.
            if (indexOfKey==-1)
                return -1;
            else if(indexOfKey==a.length-1)
                return indexOfKey;
            //find to end
            else //(indexOfKey>=0 && indexOfKey<a.length-1)
            {
                indexOfKey++;
                while(indexOfKey<a.length && a[indexOfKey]==key) indexOfKey++;
                if(indexOfKey<a.length-1) return indexOfKey-1;
                else if(indexOfKey==a.length-1 && a[indexOfKey]>key) return indexOfKey-1;
                else//(indexOfKey==a.length-1 && a[indexOfKey]==key)
                return a.length-1;
              }
        }//findBigKeyIndex
       
        public static int findKeyIndex(int key,int[]a)
        {
            int lo=0;
            int hi=a.length-1;
            while (lo<=hi)
            {
                int mid=lo+(hi-lo)/2;
                if (key<a[mid]) hi=mid-1;
                else if(key>a[mid]) lo=mid+1;
                else return mid;
              }
            return -1;
         }//findKey

      
    }

  • 相关阅读:
    从内存中加载并启动一个exe
    使用Hamcrest增强JUnit的测试能力
    Delphi编译指令说明
    Delphi 64与32位的差异
    获取exe文件窗口抓图,将memo转化为JPG输出
    Delphi 的 Utf-8 转换
    我的第一个破解软件,试验成功!
    Qt之QComboBox(基本应用、代理设置)
    常见寄存器以及常见汇编指令,常见爆破指令 good
    大神级回答exists与in的区别
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9848678.html
Copyright © 2020-2023  润新知