publicintfindString(String[] words,String s){int n = words.length, l =0, r = n -1;while(l < r){//退出条件为l==rint m = l +(r - l)/2;//下取整int t = m;//存下来m的值while(m < r && words[m].equals("")) m++;if(r == m){//m一直向右边滑动到r位置,都是空格
r = t -1;//[t,r]都是空格,这段区间可以被排除掉continue;}//m已经被筛选出来了, r l 的缩放区间可以不用再考虑mif(words[m].equals(s))return m;elseif(s.compareTo(words[m])>0){
l = m +1;}else{
r = m -1;}}//因为无法判断l是否满足,需要判断return words[l].equals(s)? l :-1;}
方法2
publicintfindString(String[] words,String s){int n = words.length, l =0, r = n -1;while(l <= r){//退出条件为l>rint m = l +(r - l)/2;//下取整int t = m;//存下来m的值while(m < r && words[m].equals("")) m++;if(r == m){//m一直向右边滑动到r位置,都是空格
r = t -1;//[t,r]都是空格,这段区间可以被排除掉continue;}//m已经被筛选出来了, r l 的缩放区间可以不用再考虑mif(words[m].equals(s))return m;elseif(s.compareTo(words[m])>0){
l = m +1;}else{
r = m -1;}}//因为无法判断l是否满足,需要判断//因为出口的 l和 r 并不相等,且有可能数组越界if(l < n && words[l].equals(s))return l;if(r >=0&& words[r].equals(s))return r;return-1;}
修改自方法2
publicintfindString(String[] words,String s){int n = words.length, l =0, r = n -1;while(l <= r){//退出条件为l>rint m = l +(r - l)/2;//下取整System.out.printf("%d,%d,%d\n", l, m, r);int t = m;//存下来m的值while(words[m].equals("")&& m < r) m++;if(words[m].equals("")){//需要排除掉是否是""的情况// if (r == m) {//m一直向右边滑动到r位置,都是空格
r = t -1;//[t,r]都是空格,这段区间可以被排除掉continue;}//m已经被筛选出来了, r l 的缩放区间可以不用再考虑mif(words[m].equals(s))return m;elseif(s.compareTo(words[m])>0){
l = m +1;}else{
r = m -1;}}//因为无法判断l是否满足,需要判断//因为出口的 l和 r 并不相等,且有可能数组越界// if (l < n && words[l].equals(s)) return l;// if (r >= 0 && words[r].equals(s)) return r;return-1;}
方法3
publicintfindString(String[] words,String s){int n = words.length, l =0, r = n;while(l < r){int m = l +(r - l)/2;int t = m;while(m < r && words[m].equals("")){
m++;}if(r == m){
r = t;continue;}if(words[m].equals(s))return m;elseif(words[m].compareTo(s)>0) r = m;else l = m +1;}return-1;}
方法4
publicintfindString(String[] words,String s){int n = words.length, l =0, r = n -1;//对比方法3的r的初始值while(l < r){//退出条件为l==rint m = l +(r - l)/2;//下取整int t = m;//存下来m的值while(m < r && words[m].equals("")) m++;if(r == m){//m一直向右边滑动到r位置,都是空格
r = t -1;//[t,r]都是空格,这段区间可以被排除掉continue;}//m已经被筛选出来了, r l 的缩放区间可以不用再考虑mif(words[m].equals(s))return m;elseif(s.compareTo(words[m])>0){
l = m +1;}else{
r = m -1;}}//因为无法判断l是否满足,需要判断return words[l].equals(s)? l :-1;}