• if(preg_match('/[\x{4e00}-\x{9fa5}]/u', $filename)>0 || preg_match('/[\x81-\xfe]/u', $filename)>0 ){
        // 含有中文或全角
      }else{
        // 不含
    }

  • 最近新发现一个hugo主题,https://github.com/zzossig/hugo-theme-zzo,觉得好看便改成了wordpress主题用到了自己的博客上,然后发现这个主题的css样式写的我有点看不懂,原来是用的grid布局,了解了一下发现这个布局方式好强大啊

    (更多…)

  • set currentDate=%date:/=_%
    set currentDate=%currentDate:~0,10%
    
    set currentTime=%time:~0,5%
    set currentTime=%currentTime: =0%
    set currentTime=%currentDate%_%currentTime::=%
    
    echo %currentTime%
    # 2020_08_03_1630

    批处理不能在一行内对字符串作出多个操作,所以不能又替换又截取


  • 第一种:也是我写的,弱智写法,两个for不断循环累积子串判断有没有重复

    /**
     * @param {string} s
     * @return {number}
     */
    var lengthOfLongestSubstring = function(s) {
        if (s =='') return 0
        let count = 1,max = 1
        for(let i = 0; i< s.length; i++) {
            let tmp = new Map()
            tmp.set(s[i],1)
            for (let j = i+1; j < s.length; j++) {
                if(!tmp.has(s[j])) {
                    tmp.set(s[j],1)
                    count ++
                }
                else {
                    count = 1
                    break
                }
                if(count>max) max = count
                if(j ==  s.length-1) count =1
            }
        }
        return max
    };

    时间复杂度为O(n^3)

    第二种,通过迭代字符串然后slice截取字符串再用indexof找到重复的字符串,遇到重复的就把startnum重置,最后找到最长子串

    var lengthOfLongestSubstring = function(s) {
        let startNum = 0;
        let maxNum = 0;
        s.split('').forEach((v, i) => {
            const index = s.slice(startNum, i).indexOf(v);
            if(index === -1) {
                // 无重复字符
                maxNum = Math.max(maxNum, i - startNum + 1);
            } else {
                // 重复字符
                startNum = index + startNum + 1;
            }
        });
        return maxNum;
    };
    


  • 我自己的写法:很容易理解,出现递增就让z为true,出现递减就让j为true,当索引>0且z和j都为true时,就不是单调数组了

    /**
     * @param {number[]} A
     * @return {boolean}
     */
    var isMonotonic = function(A) {
        let z = j = false
        for(let i = 0; i<A.length; i++) {
            if(A[i] < A[i+1]) z = true 
            if(A[i] > A[i+1]) j = true 
            if (i>0 && z && j ) return false 
        }
        return true
    };

    题目

    如果数组是单调递增或单调递减的,那么它是单调的。

    如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。

    当给定的数组 A 是单调数组时返回 true,否则返回 false。


  • 弱智写法:两个循环

    /**
     * @param {number[]} nums
     * @return {boolean}
     */
    var containsDuplicate = function(nums) {
        if (nums.length == 1) return false
        for (let i = 0; i<nums.length; i++) {
            for (let j = 0; j<nums.length; j++) {
                if (i == j) continue
                if (nums[i] == nums[j]) {
                    return true
                }
            }
        }
        return false
    };
    弱智写法

    排序然后比较两个相邻的元素,但是用到 sort() 函数 不推荐

    /**
     * @param {number[]} nums
     * @return {boolean}
     */
    var containsDuplicate = function(nums) {
        nums.sort()
        for(let i = 0; i < nums.length; i++) {
            if (nums[i] == nums[i+1]) return true
        }
        return false
    };

    第三种方法:set方法

    set对象用于储存唯一值,如果nums有重复的值,会自动去掉,然后再比较长度就行了

    /**
     * @param {number[]} nums
     * @return {boolean}
     */
    var containsDuplicate = function(nums) {
        return new Set(nums).size < nums.length
    };

    但是感觉用到此类高级方法,算法题就变得没意思了

    方法四:将值全部储存在map,然后有遇到重复的就返回true

    /**
     * @param {number[]} nums
     * @return {boolean}
     */
    var containsDuplicate = function (nums) {
        const map = new Map();
        for (let i = 0; i < nums.length; i++) {
            if (map.has(nums[i])) {
                return true;
            } else {
                map.set(nums[i], 1);
            }
        }
        return false;
    };
    

    map对象学习: http://es6.ruanyifeng.com/#docs/set-map#Map


  • 给定一个大小为 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

    特别注意题目的 大于 二字,这里的思路是先把数组的第一个元素存起来,然后在第一次循环的时候 count 就会+1,然后遇到不同的 -1,当count==0的时候 将下一个元素赋给tmp,绝对要是下一个元素,这样才能在下一个循环的时候 保证count为正数

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var majorityElement = function(nums) {
        let tmp = nums[0], i =0, count = 0
        for(; i< nums.length; i++) {
            if (tmp !== nums[i]) {
                count -- 
            } else {
                count ++
            }
            if (count == 0)  tmp = nums[i+1]
            console.log(count)
        }
        
        return tmp
    };

  • 第一种办法是声明一个新数组,然后遍历原数组将偶数放入新数组的前面,奇数放到新数组的后面

    /**
     * @param {number[]} A
     * @return {number[]}
     */
    var sortArrayByParity = function(A) {
        let s =0,j=A.length-1,b = []
        for(let i =0; i< A.length; i++) {
            if(A[i]%2 == 0) {
                b[s] = A[i]
                s++
            } else {
                b[j] = A[i]
                j--
            }
        }
        return b
    };

    第二种是原地算法,用两个指针从数组前后同时遍历,遇到前奇后偶的就叫唤一下

    /**
     * @param {number[]} A
     * @return {number[]}
     */
    var sortArrayByParity = function(A) {
        let i=0;j=A.length-1
        while (i <j) {
            if(A[i]%2 >A[j]%2) {
                let tmp = A[j]
                A[j] = A[i]
                A[i] = tmp
            }
            if (A[i]%2==0) i++
            if (A[j]%2==1) j--
        }
        return A
    };

    题目

    给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。


  • 这题就很简单了,直接 for 循环,判断是 1 就给 temp +1 然后到 0 之后就判断是否是最大 然后 temp 置 0

    如果最后一个元素是1的话 是跳不到else里的,所以需要在最后 比较一下 temp 和 ans

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var findMaxConsecutiveOnes = function(nums) {
        if (nums.length===1) return nums[0] === 0 ? 0 : 1 
        let ans = temp = 0 
        for(let i = 0; i < nums.length; i++) {
            if (nums[i] == 1) {
                temp++
            } else {
                if (temp > ans) {
                    ans = temp
                }
                temp = 0
            }
        }
        if(temp>ans) ans=temp
        return ans
    };

    Max Consecutive Ones

    Given a binary array, find the maximum number of consecutive 1s in this array.

    Example 1:

    Input: [1,1,0,1,1,1]
    Output: 3
    Explanation: The first two digits or the last three digits are consecutive 1s.
        The maximum number of consecutive 1s is 3.
    

    Note:

    • The input array will only contain 0 and 1.
    • The length of input array is a positive integer and will not exceed 10,000