面试题 10.05. 稀疏数组搜索

2022-01-24  本文已影响0人  itbird01
题目.png

题意:稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。

解法1:
1.暴力解法,遍历string数组,找到对应的字符串

解法2:
1.二分查找,按照二分查找的思想,编写代码即可
2.二分查找过程中,处理空字符串,如果遇到空字符串,则收缩右边界(right--),但是在收缩之前,先判断一下right的值是否为s,如果是则直接返回

解题遇到的问题

1.equals与==的区别
1)基本数据类型,两者一样,对比的都是值,可以查看基本数据类型的equals实现,里面也是通过==来操作的,但是注意boolean、int有值范围默认存储对象
2)引用数据类型,==对比的是地址,两个对象地址是否一样,equals对比的是内容

2.String的对比compareTo内部如何实现的?
查看源码,是通过转换为字节数据,for循环对比每个字节实现的

后续需要总结学习的知识点

##解法1
class Solution {
    public int findString(String[] words, String s) {
        int res = -1;
        for (int i = 0; i < words.length; i++) {
            if (words[i].equals(s)) {
                res = i;
                break;
            }
        }
        return res;
    }
}

##解法2
class Solution {
    public int findString(String[] words, String s) {
        int res = binarySearch(words, 0, words.length - 1, s);
        return res;
    }

    private int binarySearch(String[] words, int i, int j, String s) {
        while (i <= j) {
            int mid = (i + j) / 2;
            if (words[mid].equals("")) {
                if (words[j].equals(s)) {
                    return j;
                } else {
                    j--;
                }
            } else {
                if (words[mid].equals(s)) {
                    return mid;
                } else if (words[mid].compareTo(s) > 0) {
                    j = mid - 1;
                } else {
                    i = mid + 1;
                }
            }
        }
        return -1;
    }
}
上一篇下一篇

猜你喜欢

热点阅读