首页 > 网站 > WEB开发 > 正文

LeetCode解题笔记(1)

2024-04-27 15:13:12
字体:
来源:转载
供稿:网友
前天开始知道有LeetCode的存在,抱着试一试的心态,尝试着做了几道题,几乎都是暴力求解,也看到自己在这方面的欠缺。下面是做题的一些体会。1.Two SumGiven an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.大意:给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。你可以假设每一个输入肯定只有一个结果。

将我的暴力求解贴出来:

/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function(nums, target) {    for(var i = 0;i < nums.length;i++){        for(var j = i+1;j < nums.length;j++ ){            if((nums[i]+nums[j]) === target){                return [i,j];            }        }    }};时间复杂度O(n^2)想了一下改进方法:可以先将数组内的元素排好序,设置一个low指针,一个high指针,分别指向头、尾元素。将两指针指向的元素相加,若大于target,high指针向前移;若小于target,low指针向后移。(还没实践,不知正确否)

13.Roman To Integer

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999

大意:将给定的罗马数字转换成整数,范围是1-3999

虽然特意挑的难度为easy的题目,但是不知道罗马数字规则的我,一下子有些蒙,故百度之。

罗马数字符号对应的数值如下:

I

1

V

5

X

10

L

50

C

100

D

500

M

1000

计数规则:相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4正常使用时,连续的数字重复不得超过三次在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则)其次,罗马数字转阿拉伯数字规则(仅限于3999以内):从前向后遍历罗马数字,如果某个数比前一个数小,则加上该数。反之,减去前一个数的两倍然后加上该数加粗即为解题关键了~ 
/** * @param {string} s * @return {number} */var romanToInt = function(s) {    var array = s.split("");    for(var i = 0;i < array.length;i++){        switch(array[i]){            case "I" :                array[i] = 1;                break;            case "V" :                array[i] = 5;                break;            case "X" :                array[i] = 10;                break;            case "L" :                array[i] = 50;                break;            case "C" :                array[i] = 100;                break;            case "D" :                array[i] = 500;                break;            case "M" :                array[i] = 1000;                break;        }    }        var total = array[0];    for(var j = 1;j < array.length;j++){       if(array[j] <= array[j-1]){           total += array[j];       }       else{           total = total - 2 * array[j-1] + array[j];       }    }        return total;};7.Reverse Integer

Reverse digits of an integer.

Example1: x = 123, return 321Example2: x = -123, return -321

Note:The input is assumed to be a 32-bit signed integer. Your function shouldreturn 0 when the reversed integer overflows.

这题的溢出条件当时给我折磨坏了!一个是32位,一个是当reverse完之后的数溢出返回0!因为这两点没注意到,wrong answer 和 running  error好几次。。

先说下我的思路吧:因为我知道数组有一个array.reverse()方法,很方便。所以先用一个变量存正负状态,然后将传进来的数字转换为字符串在转化为数组再reverse再变成字符串再返回数字(我脑子可能有问题用了这么麻烦的办法。。)代码如下:

/** * @param {number} x * @return {number} */var reverse = function(x) {    var flag = 0;    if(x<=0){        flag = 0;        x = -x;    }else {        flag = 1;    }    var tem = x.toString().split("").reverse().join("");    var a = parseInt(tem);        var max = 0x7fffffff;        var min = 0x80000000;      if(a > max || a < -min) {           return 0;    }else{        if(flag){            return a;        }else{            return -a;        }     }};后来百度到一些大牛的方法,简直秒杀我

 while(x > 0){ rev = x %10 +rev *10;  x = x/10;}

461.Hamming Distance

Example:

Input: x = 1, y = 4Output: 2Explanation:1   (0 0 0 1)4   (0 1 0 0)       ↑   ↑The above arrows point to positions where the corresponding bits are different. 直接放例子了 比较易懂

做这道题的一个困难的地方是 js 没有直接十进制转换为二进制的方法?

查到ArrayBuffer和TypedArray(这是真的不知道了。。)还有就是toString(2)转换成二进制的字符串

我的思路:将传进来的两个数字转换成二进制后split成数组,再将两数组位数凑成一样。(将长度短的数组前面补0,我怎么这么喜欢数组2333)

遍历数组,有不同即flag++(就是按位异或,真的不知道js中的按位异或怎么实现?)

/** * @param {number} x * @param {number} y * @return {number} */var hammingDistance = function(x, y) {    x = x.toString(2).split("");    y = y.toString(2).split("");    if(x.length < y.length){        newarray(x,y);    }    else if(x.length > y.length){        newarray(y,x);    }        function newarray (a,b){        var arr = new Array(b.length - a.length);        for(var i = 0;i < arr.length;i++){            arr[i] = "0";        }        a = arr.concat(a);         return a,b;    }        var flag = 0;    for(var n = x.length,m = y.length;n > 0 , m > 0 ;n--,m--){        if(x[n] != y[m]){            ++flag;        }    }        return flag;};

这题肯定有更简单的法子的!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表