算法编程题小技巧

  1. 当题目中涉及到圆、手链等循环的,可以通过数组的移动,一个循环遍历所有的可能。

    for(var i = 0 ; i < len ; i++){
    	//把第一个放到最后一个
    	var first = arr.splice(0, 1);
        arr.push(first[0]);
    }
    
  2. 当题目求一个满足条件的字符串时,可以利用一个字符串串长度作为循环条件,内部一层循环可以利用起始位置做循环,结束位置利用起始和长度计算

    for (var k = 3; k < len; k++) { //子串长度
        for (var i = 0; i <= len - k; i++) { //起始地址
            var j = i + k - 1; //结束位置
        }
    }
    
  3. 当明显题目要求复杂度时

    放弃用函数 sort() ,复杂度最少也要 O(nlogn),最慢 n^2;
    Math.Max() 和 Math.min() 需要 O(n) ,可以酌情使用。
    
  4. 用位运算做加法

    获得加法的个位数:用异或^  
    比如 5+7 : 101^111=010 ,也就是个位数2 ,和不超过10的直接就是结果2+5: 010+101=111;
    
    获得进位:相当于两个数做 & 操作,再向左移一位得到
    101 & 111 = 101  101<<1 = 1010 结果5+7的进位是10
    
    循环上面两步,直到进位为0
    
    function Add(num1, num2)
    {
        while(num2!==0){
            var ge = num1^num2;
            num2 = (num1&num2)<<1;
            num1 = ge;
        }
        return num1
    }
    
    
  5. 注意splice返回的是数组,转数字可以简单的直接num - '0'.

  6. 动态规划:最长回文字符串

    两种方法:
    1、动态规划
    2、中心扩展法:讨论两种情况: 奇数型:‘aba’ 和 偶数型:‘baab’
    链接: https://blog.csdn.net/wangbaochu/article/details/53861833

  7. 寻找数组所有的逆序对,在不考虑时间复杂度的情况下,自己想的有以下几种:但都是n^2

    1、遍历数组,双重循环进行比较
    
    2、先对数组arr1排序(小到大),然后对排序后的数组arr2遍历,找到原数组arr1的该值的位置index,
    这个index就是前面比该数大的数值个数,在arr1中删除这个数,循环。。。
    
    3、跟2一样,只是不排序,通过找最小值来进行
    
    function InversePairs(data) {
        var count = 0;
        while (data.length > 0) {
    		
            var min = Math.min(...data);
            var index = data.indexOf(min);
            count += index;
            data.splice(index, 1);
        }
        return count;
    }
    

你可能感兴趣的:(编程题)