將我的暴力求解貼出來:
/** * @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;};這題肯定有更簡單的法子的!
|
新聞熱點
疑難解答