题目
原文:
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")); } }