将我的暴力求解贴出来:
/** * @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 |
/** * @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 IntegerReverse 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;};这题肯定有更简单的法子的!
新闻热点
疑难解答