字符串问题之 在有序但含有空的数组中查找字符串

字符串问题之 在有序但含有空的数组中查找字符串

尽可能使用二分查找

   假设在 left  right 之间查找  

    关键是mid处理过程 导致 left 跟 right 的改变  控制去哪里寻找

    分如下情况:

   若 mid处 不为空,并且 此处就是 str   那么记下 mid  ,同时把right-1   (往左寻找)

   若 mid处不为空,并且此处不是str,比较字典顺序

   若 mid处为空, 则通过while控制向左边移动,左边没有元素,或者找到的字典顺序小于str,left=mid+1

                           字典顺序大于str  或者等于 str  此时 res = strs[i].equals(str) ? i : res        然后right=i-1;  注意是i-1  此处的位置-1

package TT;

import java.awt.List;


public class Test3 {
 
     public static int getIndex (String[] strs, String str){
    	 
    	 if(strs==null || strs.length==0 ||str ==null){
    		  return -1;
    	 }
    	 
    	 int res = -1;
    	 int left =0;
    	 int right = strs.length;
    	 int mid = 0;
    	 int i =0;
    	 while(left <= right){
    		 mid=(left+right)/2;
    		if(strs[mid]!=null && strs[mid].equals(str)){
    			res = mid;
    			right = mid-1;
    		}else if(strs[mid]!=null){
    			if(strs[mid].compareTo(str)<0){
    				  left = mid+1;
    			}else {
					right = mid-1;
				}
    		}else{
    			
    			i = mid;   //把此时的mid记下了
    			while(strs[i]==null && --i>=left);
    			
    			if(i<left || strs[i].compareTo(str)<0){
    				left = mid+1;
    			}else{
    				res =strs[i].equals(str) ? i :res;
    				right = i-1;
    			}
    			
    		}
    	 }
    	 
    	 return res;
	 
     }
	
     
     
    public static void main(String[] args){
    	
    	   String[] objects = new String[6];
    	   objects[0]=null;
    	   objects[1]="b";
    	   objects[2]=null;
    	   objects[3]="b";
    	   objects[4]=null;
    	   objects[5]="a";
    	    
    	   String s = "b";
    	  int a = getIndex(objects,s);
    	  System.out.println(a);
    	  
    	   
    	
    } 
     
     
     
     
     
     
     
     
     
	
}

  

posted @ 2017-08-20 09:54 toov5 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值