• 剑指offer


    剑指OFFER

    • 找出数组中重复的数字

    思路:设置n个坑,每次检查当前坑的数和当前的坑是否匹配,以及当前以当前坑上的数作为坑里面是否已经有当前坑的数(有点绕人!)
    代码:

    class Solution {
    public:
        int duplicateInArray(vector<int>& nums) {
            int len = nums.size();
            for (auto x : nums)
                if (x < 0 || x >= len)
                    return -1;
            for (int i = 0; i < len; i++) {
                while (i != nums[i] && nums[i] != nums[nums[i]]) {
                    swap(nums[i],nums[nums[i]]);
                }
                if (nums[i] != i && nums[i] == nums[nums[i]])
                    return nums[i];
            }
            return -1;
        }
    };
    
    • 不修改数组找出重复的数字

    思路一:开辟额外的数组 空间复杂度O(N)

    class Solution {
    public:
        int duplicateInArray(vector<int>& nums) {
            int len = nums.size();
            int arr[len];
            for (int i = 0; i < len; i++) {
                arr[i] = 0;
            }
            for (int i = 0; i < len; i++) {
                arr[nums[i]]++;
                if (arr[nums[i]] > 1) {
                    return nums[i];
                }
            }
        }
    };
    

    思路二:抽屉原理+分治法 空间复杂度O(1);

    class Solution {
    public:
        int duplicateInArray(vector<int>& nums) {
            //分治法 + 抽屉原理
            int l = 1, r = nums.size() - 1;
            while (l < r) {
                int mid = (l + r) >> 1;
                int cnt = 0;
                for (auto x : nums) 
                    cnt += (x >= l && x <= mid);
                if (cnt > mid - l + 1) r = mid;
                else l =  mid + 1;
            }
            return r;
        }
    };
    
    • 二维数组中的查找

    O(m+n) 线性查找

    代码:

    class Solution {
    public:
        bool searchArray(vector<vector<int>> array, int target) {
            int len = array.size();
            if (array.empty() || array[0].empty()) {
                return false;
            }
            int i = 0, j = len - 1;
            while (i < len && j >= 0) {
                if (array[i][j] == target) {
                    return true;
                }
                if (target > array[i][j]) i++;
                else j--;
            }
            return false;
        }
    };
    
    • 替换空格

    简单的语法题

    代码:

    class Solution {
    public:
        bool searchArray(vector<vector<int>> array, int target) {
            int len = array.size();
            if (array.empty() || array[0].empty()) {
                return false;
            }
            int i = 0, j = len - 1;
            while (i < len && j >= 0) {
                if (array[i][j] == target) {
                    return true;
                }
                if (target > array[i][j]) i++;
                else j--;
            }
            return false;
        }
    };
    
  • 相关阅读:
    教你开发jQuery插件(转)
    PHP7CMS 无条件前台GETSHELL
    如何利用GitHub搜索敏感信息
    YOU种你来丨i春秋校园行第一站北京电子科技学院
    超有料丨小白如何成功逆袭为年薪30万的Web安全工程师
    SQL基本注入演示
    从SQL注入到内网漫游
    与你有关丨微信可能隐藏着这样的安全隐患
    业务逻辑漏洞探索之敏感信息泄露
    Web安全之XSS Platform搭建及使用实践
  • 原文地址:https://www.cnblogs.com/Lysz1996/p/12492950.html
Copyright © 2020-2023  润新知