zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    并查集分析+总结
    poj 3083 Children of the Candy Corn(bfs+dfs 数组模拟方向)
    poj 1094 Sorting It All Out (拓扑排序)
    poj 2632 Crashing Robots(模拟)
    poj 1068 Parencodings (模拟)
    poj 1273 Drainage Ditches ( 最大流Edmonds_karp算法)
    poj 3278 Catch That Cow (BFS)
    Codeforces Round #109 (Div. 2) 总结
    poj 2299 UltraQuickSort(归并排序)
    poj 1035 Spell checker(字符串)
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/13189859.html
Copyright © 2011-2022 走看看