JavaScript實現演算法

來源:互聯網
上載者:User

標籤:return   completed   開始   構造   而且   ams   數字   cat   ges   

題外話

刷了一段時間的codewars的JavaScript題目之後,它給我最大的感受就是,會協助你迅速的提升你希望練習的語言的API的熟悉程度,Array對象、String對象等原生方法,建構函式、一些演算法題等。每次submit之後,看看自己的代碼,再看看別人寫的代碼。發現自己寫的代碼和實現實現思路簡直弱爆了。於是,每次都會在submi完之後,會看看Top five的答案,理解大牛們的解題思路(大多數情況下,代碼會使用ES6的文法,非常簡潔),然後train again。按照這種方法,練習了將近20來天的時間。這是我在codewars上的成果,5kyu,刷了93題,有一些題目實在想不到,就unlock solutions了。因此Honor Completed Kata並不是100%。

最近開始玩leetcode了,換個plaform主要是因為leetcode上的題目大多都是各大互連網公司的面試題目,而且大多偏向演算法。恰巧我最近迫切的想要提高這方面的能力。於是轉移了plaform,雖然我有些不舍:"( 。但是我還是會持續玩codewars的/

1-20 leetcode個人解題思路


實現思路:建立一個空數組,寫兩層迴圈。第二層迴圈的變數初始化是基於第一次迴圈的。接著做判斷,如果nums[i] + nums[j] === target,就退出迴圈。

var twoSum = function(nums, target) {    let index = [];    for (let i = 0; i < nums.length; i++) {        for (let j = i + 1; j < nums.length; j++) {            if (nums[i] + nums[j] === target) {                index.push(i);                index.push(j);                break;        }    }}    return index;};
ZigZag Conversion(Difficulty: Easy; Tags: String)


首先,要想完成這道題目,需要明白的是。ZigZag pattern與給定的行數有什麼關係。

很簡單,只有2行、3行、4行時zigzag的形狀分別如下

這個題目主要的思路是明白給定的行數與每行中需要提取的字母位置之間的關係。

  1. 當只有一行時,直接返回原字串
  2. 當大於一行時,第一行和最後一行的規律相同,即(假定指定行數是n,此時n>1)每個圓圈(代碼一個值)都是每隔[ n - (n - 2) ] * (n - 1)個位置出現一次
  3. 除了第一行和最後一行,中間行數圓圈的分布也有規律:畫藍色箭頭的後一個值與前一個值相差 2 * (n - 1)個位置,畫綠色箭頭的兩個值也遵循這個規律。因此,實現代碼如下

var convert = function(s, numRows) {    if (numRows === 1) return s;    let str = ‘‘;    let num = (numRows - (numRows - 2)) * (numRows - 1);    //2    for (let i = 1; i <= numRows; i++) {        for (let j = i - 1; j < s.length; j += num) {            if (i === 1 || i === numRows) {                str += s.slice(j, j + 1);            } else {                str += s.slice(j, j + 1);                str += s.slice(j + num - (2 * (i - 1)), j + num - (2 * (i - 1)) +   1);            }        }    }    return str;};console.log(convert("123456789", 2));               //135792468console.log(convert("123456789", 3));               //159246837console.log(convert("123456789", 4));               //172683594console.log(convert("1234567891234567891234", 5));  //1982817937261463524543


這道題目挺有意思,題目很直接,讓我們將input的指reverse。但是有要求,就是當reverse的值如果超過32bit,就要返回0。

思路是使用JS的或運算|,即位元運算符,將reverse的值轉換成32位,然後再與原值作比較。

Math.pow(2, 32)|0 返回0 (Math.pow(2, 32) + 1)|0 返回1。因此解題邏輯為

var reverse = function(x) {    let str1 = x.toString().match(/[0-9]/g).reverse().join(‘‘);    let str2 = x.toString().match(/[^0-9]/g) === null ? ‘‘ : x.toString().match(    /[^0-9]/g).join(‘‘);    let num1 = Number(str2 + str1)|0;   //reverse and transform to 32bit    let num2 = Number(str2 + str1);    return num1 === num2 ? num2 : 0;};

這個題目,主要考察對資料類型NaN的理解和對方法isNaN()的理解,同時考察對Number、parseInt、parseFloat方法的區別。這裡簡單的聲明一下。

NaN

NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用於表示一個本來要返回數值的運算元
未返回數值的情況(這樣就不會拋出錯誤了)。任何數值除以0會返回NaN。

NaN與任何值都不相等,包括NaN本身。因此console.log(NaN === NaN) // false

isNaN是用來判斷參數是否“不是數值”。

parseInt

parseInt和parseFloat用於將字串轉換為數實值型別,而Number用於轉換任何資料類型,這裡主要介紹一下parseInt。

parseInt會忽略字串前面的空格,直至找到一個非空白字元。如果第一個字元不是數字字元或者負號或者正號,parseInt會返回NaN。也就是說,用parseInt()轉換Null 字元串會返回NaN(Number()對Null 字元返回0)如果第一個字元是數字字元,parseInt()會繼續解析第二個字元,直到解析完所有後續字元或者遇到了一個非數字字元。例如,"1234blue"會被轉換為1234,因為"blue"會被完全忽略。類似地,"22.5"會被轉換為22,因為小數點並不是有效數字字元;‘-123‘會被轉換為-123,因為第一個字元是負號,而後面的字元都是數字;‘-+123‘會返回NaN,因為第一個字元是-,而第二個字元卻是+,不符合正常的數值模式。

因此,此題的解題思路如下:

var myAtoi = function(str) {    let symbol = ‘‘;    str = str.replace(/^\s+|\s+$/g, ‘‘);//去除兩端空格    str = isNaN(parseInt(str)) ? 0 : parseInt(str);    if (str > Math.pow(2, 31) - 1) {        return Math.pow(2, 31) - 1;    } else if (str < - Math.pow(2, 31)) {        return - Math.pow(2, 31);    } else {        return str;    }};

持續更新中...

  標籤: leetcode

JavaScript實現演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.