-
当题目中涉及到圆、手链等循环的,可以通过数组的移动,一个循环遍历所有的可能。
for(var i = 0 ; i < len ; i++){ //把第一个放到最后一个 var first = arr.splice(0, 1); arr.push(first[0]); }
-
当题目求一个满足条件的字符串时,可以利用一个字符串串长度作为循环条件,内部一层循环可以利用起始位置做循环,结束位置利用起始和长度计算
for (var k = 3; k < len; k++) { //子串长度 for (var i = 0; i <= len - k; i++) { //起始地址 var j = i + k - 1; //结束位置 } }
-
当明显题目要求复杂度时
放弃用函数 sort() ,复杂度最少也要 O(nlogn),最慢 n^2; Math.Max() 和 Math.min() 需要 O(n) ,可以酌情使用。
-
用位运算做加法
获得加法的个位数:用异或^ 比如 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 }
-
注意
splice
返回的是数组,转数字可以简单的直接num - '0'
. -
动态规划:最长回文字符串
两种方法:
1、动态规划
2、中心扩展法:讨论两种情况: 奇数型:‘aba’ 和 偶数型:‘baab’
链接: https://blog.csdn.net/wangbaochu/article/details/53861833 -
寻找数组所有的逆序对,在不考虑时间复杂度的情况下,自己想的有以下几种:但都是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; }
算法编程题小技巧
猜你喜欢
转载自blog.csdn.net/HYeeee/article/details/89449789
今日推荐
周排行