Cracking the coding interview--Q9.5

题目

原文:

Given a sorted array of strings which is interspersed with empty strings, write a method to find the location of a given string.

Example: find “ball” in [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”,“”, “dad”, “”, “”] will return 4

Example: find “ballcar” in [“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] will return -1

译文:

给一个有序的字符串数组,并且它是被空字符串穿插的,写一个方法找出给出的字符串在数组中的位置。

例如:“ball”在数组[“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”,“”, “dad”, “”, “”]中,返回4

例如:“ballcar”在数组[“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] 中,返回-1

解答

当然最直观简单的方法,就是遍历一遍数组找出目标字符串,输出对应的位置即可;但字符串数组已经是有序,所以可以通过二分查找的方法;又由于字符串数组被一些空字符串穿插,所以要判断str[mid]是否为空字符串(如果是,就无法对比大小,就不能确定要找的字符串在左边还是右边),若是,就一直向右移动, 直到字符串不为空或是位置已经超出了high下标。如果位置已经超出high下标, 就在[low, mid-1]这一段查找;如果没有超出high下标,那就和要查找的x进行对比。 相等时返回下标,不等时再根据比较出的大小决定到哪一半去查找。

代码如下:

class Q9_5{
	public static int searchStr(String[] str,int low,int high,String targetStr){
		if(targetStr.equals("")) return -1;            //不考虑查找为空字符的情况
		while(low<=high){
			int mid=(low+high)>>2;
			int temp=mid;
			if(str[mid].equals("")&&temp<=high)
				temp++;
			if(temp>high) high=mid-1;
			else{
				if(str[temp].equals(targetStr)) return temp;
				else if(str[temp].compareTo(targetStr)>0) high=temp-1;
				else low=temp+1;
			}
		}
		return -1;
	}
	
	public static void main(String[] args){
		String[] str= {
        	"at", "", "", "", "ball", "", "", "car", "", "", "dad", "", ""
    	};
    	System.out.println(searchStr(str,0,12,"ball"));
    	System.out.println(searchStr(str,0,12,"ballcar"));
	}
}

---EOF---

你可能感兴趣的:(Cracking the coding interview--Q9.5)