2020/6/24 面试题总结

查找第一个非重复的字符,无得话返回-1,做的时候返回了字符数组的编号,太着急了,枯了。。。。。。。
@Test
    public void searchfeichong(){
        // 查找第一个非重复的字符,无得话返回-1
        String str = "dawdhkadh";
        char[] sc = str.toCharArray();
        HashMap<Character,Integer> map = new HashMap<>();
        for (int i = 0; i < sc.length; i++) {
            if (map.containsKey(sc[i])){
                map.put(sc[i],map.get(sc[i]) + 1);
            }else {
                map.put(sc[i],1);
            }
        }
        for (int i = 0; i < sc.length; i++) {
            if (map.get(sc[i]) == 1){
                System.out.println("非重复的第一个字符为:" + sc[i]);
                return;
            }
        }
        System.out.println(-1);
    }

  最开始的时候出的题目

给定一个无重复元素的数组candidates和一个目标函数target,找出candidates中所有可以使得数字和为target的组合。

 

现在想想,不难,解法如下:

          快速排序,在一个有序的数组(从小到大)中最左边一定是最小值,最右边是最大值。我们可将最小值与最大值相加与目标值进行比较,如果两数之和大于目标值,我们就让最大值小一点(读取第二个最大值),如果两数之和小于目标值,我们就让最小值大一点(读取第二个最小值),如果两数之和刚好等于目标值,保存最大值,最小值,并且让最大值小一点,最小值大一点。需要注意的是前提条件是数组必须有序!!!

        简化:对nums先排序,然后定义两个指针,一个low = 0指向数组头,一个high = len(nums) - 1指向数组的尾,看其和nums[low]+nums[high]是否== target;若==,则查找成功返回;若>sum,则尾指针high--;若<sum,则头指针low++。

        时间复杂度:快排O(NlogN),查找O(N);所以总的时间复杂度为:O(NlogN)。

# 快速排序思想
def getRes_QuickSort(nums, target):
    nums = sorted(nums)
    len1 = len(nums)
    res = []
    if len1>= 2:
        low, high = 0, len1-1
        while low < high:
            if nums[low] + nums[high] == target:
                res.append((nums[low], nums[high]))
                low += 1
                high -= 1
            elif nums[low] + nums[high] > target:
                high -= 1
            else:
                low += 1
        return res

  使用哈希表的思维去解:

    给定一个数,根据hash表查找另一个数只需要O(1)的时间。但需要空间换时间,空间复杂度为O(n);可以用hashMap实现,hashMap<a[i], 次数>。遍历一遍数组,若次数没有存在hashMap中,则将其加入,次数为1;再遍历一遍数组,对每个值nums[i],判断target - nums[i]是否在hashmap中【即对应的value是否==1】;若存在,则查找成功;否则继续遍历下一个。直到遍历完整个数组。

# 哈希表思想
def getRes_HashMap(nums, target):
    result = []
    for i, value in enumerate(nums):
        if (target - value) in nums[i+1:]:
            result.append((value, target - value))
    return result

  

 

posted @ 2020-06-24 21:01  布尔先生  阅读(221)  评论(0编辑  收藏  举报