W3Cschool——初級腳本算法題

JS-train

前言

偶然看到W3Cschool上有個編程挑戰,裏面的題目前是面向前端方面的,也有一些算法和數據結構的題在,我花了兩天的時間把16道初級腳本算法的題完成並作一個思路分享,從中有必定的收穫,題目從實際出發,須要靈活運用各個JS對象的屬性和方法才能完成,反覆的加深了我對這些方法的認識和理解以及運用,也鍛鍊了個人邏輯思惟能力。作這些題確實頗有幫助,之後有時間天天再去作一兩道中級的,最後再整理出來把個人解法和思路與你們共享。前端

翻轉字符串

先把字符串轉化成數組,再借助數組的reverse方法翻轉數組順序,最後把數組轉化成字符串。
你的結果必須得是一個字符串算法

function reverseString(str) {
            var arr = [];
            arr = str.split("");
            arr.reverse();
            str = arr.join("");
            return str;

        }
        console.log(reverseString("hello"));

知識點:編程

  1. split() 把字符串分割爲字符串數組。數組

  2. reverse() 反轉數組的元素順序。數據結構

  3. join() 把數組轉換爲字符串,並返回結果。函數

階乘算法挑戰

計算一個整數的階乘
若是用字母n來表明一個整數,階乘表明着全部小於或等於n的整數的乘積。性能

// //for循環
        // function factorialize(num) {
        //     var i = 1
        //     var sum = 1;
        //     for (; i < num + 1; i++) {
        //         sum = sum * i;
        //     }
        //     return sum;
        // }
        // 遞歸實現  
        function factorialize(num) {
            if (num == 1 || num == 0)
                return 1;
            else {
                return factorialize(num - 1) * num;
            }

        }
        console.log(factorialize(0));

迴文算法挑戰

若是一個字符串忽略標點符號、大小寫和空格,正着讀和反着讀如出一轍,那麼這個字符串就是palindrome(迴文)。優化

  1. 你須要去掉字符串多餘的標點符號和空格ui

  2. 而後把字符串轉化成小寫來驗證此字符串是否爲迴文。this

function palindrome(str) {
            //傳入字符串處理
            var newstr = str.replace(/[^0-9a-z]/gi, "");
            newstr = newstr.toLowerCase();
            // // 方法一
            // //轉換成數組並進行反向排序
            // var arr = newstr.split("");
            // arr.reverse();
            // //把排序後的轉換爲字符串進行全等判斷
            // arr = arr.join("");
            // if (newstr === arr) {
            //     return true;
            // } else {
            //     return false;
            // }
            //方法二 從字符串頭部和尾部,逐次向中間檢測
            for (var i = 0, j = newstr.length - 1; i < j; i++, j--) {
                //這裏注意下,for循環內部只判斷不符合要求的,
                //若是循環後都沒返回false就在for外部返回true,不要在內部直接返回true或提早出來
                if (newstr.charAt(i) !== newstr.charAt(j)) {
                    return false;
                }
            }

            return true;
        }


        console.log(palindrome("assa"));

尋找最長的單詞算法挑戰

找到提供的句子中最長的單詞,並計算它的長度。
函數的返回值應該是一個數字。

function findLongestWord(str) {
            var arr = str.split(" "),
                i = 0,
                maxLengthNum = 0;
            // var index = i + 1;
            //方法一:複雜化方法:冒泡排序解法(直接第一個想到就是這個,就順着來作了,發現複雜化,
            //只須要把數組長度和最大值取出來作比較就好了)
            //     for (; i < arr.length - 1; i++) {
            //         for (; index < arr.length; index++) {
            //             if (arr[i].length < arr[index].length) {
            //                 var temp = arr[i];
            //                 arr[i] = arr[index];
            //                 arr[index] = temp;
            //             }
            //         }
            //     }
            //     return arr[0].length;

            //方法二:取出數組長度值與歷史最大值比較,第一個默認爲起始最大值
            for (; i < arr.length; i++) {
                if (arr[i].length > maxLengthNum) {
                    maxLengthNum = arr[i].length;
                }
            }
            return maxLengthNum;
        }
        findLongestWord("The quick brown fox jumped over the lazy dog");

設置首字母大寫算法挑戰

確保字符串的每一個單詞首字母都大寫,其他部分小寫。

//方法一:複雜化,沒有使用charAt+replace、map() + slice()

        // function titleCase(str) {
        //     var arr = str.toLowerCase().split(" ");
        //     var newArr = new Array();
        //     var i = 0;
        //     for (; i < arr.length; i++) {
        //         newArr[i] = arr[i].split("");
        //         newArr[i][0] = newArr[i][0].toUpperCase();
        //         newArr[i] = newArr[i].join("");
        //     }
        //     arr = newArr.join(" ");
        //     console.log(arr);
        //     return arr;
        // }
        //方法二:簡單化用replace替換首字母大寫
        // function titleCase(str) {
        //     var arr = str.toLowerCase().split(" ");
        //     var i = 0;
        //     for (; i < arr.length; i++) {
        //         var Up = arr[i].charAt(0).toUpperCase();
        //         arr[i] = arr[i].replace(arr[i].charAt(0), Up);
        //     }
        //     return arr.join(" ");
        // }
        //方法三:map() + replace()
        function titleCase(str) {
            var arr = str.toLowerCase().split(" ").map(function(word) {
                return (word.charAt(0).toUpperCase() +
                    word.slice(1));
            }).join(" ");
            console.log(arr);
            return arr;
        }
        titleCase("I'm a little tea pot");

尋找數組中的最大值算法挑戰

右邊大數組中包含了4個小數組,分別找到每一個小數組中的最大值,而後把它們串聯起來,造成一個新數組。

方法一:

function largestOfFour(arr) {
            var i = 0,
                j = 0,
                maxArr = [];
            for (; i < arr.length; i++) {
                var max = 0; //內部循環後,比較值要清空一次。
                for (; j < arr[i].length; j++) {
                    if (arr[i][j] > max) {
                        max = arr[i][j];
                    }
                }
                maxArr.push(max);
            }
            return maxArr;
        }
        largestOfFour([
            [13, 27, 18, 26],
            [4, 5, 1, 3],
            [32, 35, 37, 39],
            [1000, 1001, 857, 1]
        ]);

方法二(提供者:沐辰樓-姬):

function largestOfFour(arr) {
            var i = 0;
            var maxArr =[];
            for (; i < arr.length; i++) {               
                for (var j = 0; j < arr[i].length; j++) {
                    if (j===0) {
                        maxArr[i] = arr[i][j];
                    }else{
                        //採用Math對象的max方法取值優化內部循環性能
                      maxArr[i]=Math.max(maxArr[i],arr[i][j]);
                    }
                }
            }
            return maxArr;
        }

確認末尾字符算法挑戰

檢查一個字符串(str)是否以指定的字符串(target)結尾。

//方法一:使用lastIndexOf從最後開始查找,並返回對應的起始位置到其索引,再作比較,indexOf也可實現返回索引
        // function confirmEnding(str, target) {
        //     var index = str.lastIndexOf(target);
        //     return index == str.length - target.length;
        // }
        //方法二:使用substr抽取出字符,用負數來實現從末尾抽對應的查詢字符的長度
        //若是查找的字符實在最後出現,則抽取出來的應該和須要查找的同樣,同理slice也能夠實現提取
        function confirmEnding(str, target) {
            var endingPart = str.substr(-(target.length));
            return target === endingPart;
        }
        console.log(confirmEnding("Walking on water and developing software from a are easy if both are frozen specification", "specification"));

重複操做算法挑戰

重複一個指定的字符串 num次,若是num是一個負數則返回一個空字符串。

function repeat(str, num) {
            var temp = str,
                i = 0;
            if (num < 0) {
                return "";
            } else {
                for (; i < num - 1; i++) {
                    str = str.concat(temp);
                }
            }
            return str;
        }
        console.log(repeat("abc", 3));

字符串截取算法挑戰

若是字符串的長度比指定的參數num長,則把多餘的部分用...來表示。切記,插入到字符串尾部的三個點號也會計入字符串的長度。可是,若是指定的參數num小於或等於3,則添加的三個點號不會計入字符串的長度。

function truncate(str, num) {
            var more = "...";
            // Clear out that junk in your trunk
            if (str.length <= num) {
                if (num <= 3) {
                    var newStr = str.substr(0, num);
                    str = newStr.concat(more);
                } else
                    return str;
            } else {
                if (num <= 3) {
                    var newStr = str.substr(0, num);
                    str = newStr.concat(more);
                } else {
                    var newStr = str.substr(0, num - 3);
                    str = newStr.concat(more);
                }

            }
            return str;
        }
        console.log(truncate("Absolutely Longer", 2));

數組分割算法挑戰

猴子吃香蕉但是掰成好幾段來吃哦!
把一個數組arr按照指定的數組大小size分割成若干個數組塊。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];

function chunk(arr, size) {
            // Break it up.
            var newArr = [];
            var index = 0,
                end = size,
                i = 0;
            var count = arr.length / size;
            console.log(count);
            for (; i < count; index += size) {
                newArr[i] = arr.slice(index, end);
                end = end + end;
                i++;
            }
            return newArr;
        }
         console.log(chunk([0, 1, 2, 3, 4, 5, 6], 3));

數組截斷算法挑戰

返回一個數組被截斷n個元素後還剩餘的元素,截斷從索引0開始。
方法一:

function slasher(arr, howMany) {
            if (arr.length > howMany) {
                arr = arr.slice(-(arr.length - howMany));
                return arr;
            } else return [];

        }
        console.log(slasher([1, 2, 3], 4));

方法二:(提供者沐辰樓-姬)

function slasher(arr, howMany) {
            for (var i = 0; i < howMany; i++) {
                //使用數組對象shift()方法,把數組的第一個元素從其中刪除,並返回第一個元素的值。
                arr.shift();
            }
            return arr;
        }

數組查詢算法挑戰

蛤蟆能夠吃隊友,也能夠吃對手。
若是數組第一個字符串元素包含了第二個字符串元素的全部字符,函數返回true。
舉例,["hello", "Hello"]應該返回true,由於在忽略大小寫的狀況下,第二個字符串的全部字符均可以在第一個字符串找到。["hello", "hey"]應該返回false,由於字符串"hello"並不包含字符"y"。["Alien", "line"]應該返回true,由於"line"中全部字符均可以在"Alien"找到。

function mutation(arr) {
            var count = 0,
                newArr, i = 0;
            newArr = arr.join(" ");
            newArr = newArr.toLowerCase().split(" ");
            newArr[0] = newArr[0].split("");
            newArr[1] = newArr[1].split("");
            console.log(newArr);
            for (; i < newArr[1].length; i++) {
                var index = 0;
                for (; index < newArr[0].length; index++) {
                    if (newArr[1][i] == newArr[0][index]) {
                        count++;
                        index = newArr[0].length;
                    }
                }
                console.log(count);
            }
            return count === arr[1].length;
        }
        console.log(mutation(["floor", "for"]));

刪除數組中特定值算法挑戰

刪除數組中的全部假值。
在JavaScript中,假值有false、null、0、""、undefined 和 NaN。

function bouncer(arr) {
            var index = 0;
            // Don't show a false ID to this bouncer.
            for (; index < arr.length; index++) {
                if (!arr[index]) {
                    arr.splice(index, 1);
                    //保證刪除數組元素後,索引不跳過下一個
                    index--; 
                }
            }
            return arr;
        }
        console.log(bouncer([7, "ate", "", false, 9]));

去除數組中任意多個值算法挑戰

實現一個摧毀(destroyer)函數,第一個參數是待摧毀的數組,其他的參數是待摧毀的值。

function destroyer(arr, del1, del2, del3) {
            var newDel = [del1, del2, del3],
                index = 0;
            for (; index < newDel.length; index++) {
                var i = 0;
                for (; i < arr.length; i++) {
                    if (arr[i] == newDel[index]) {
                        arr.splice(i, 1);
                        i--;
                    }
                }
            }
            return arr;
        }
        console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

數組排序並插入值算法挑戰

先給數組排序,而後找到指定的值在數組的位置,最後返回位置對應的索引。
舉例:where([1,2,3,4], 1.5) 應該返回 1。由於1.5插入到數組[1,2,3,4]後變成[1,1.5,2,3,4],而1.5對應的索引值就是1。
同理,where([20,3,5], 19) 應該返回 2。由於數組會先排序爲 [3,5,20],19插入到數組[3,5,20]後變成[3,5,19,20],而19對應的索引值就是2。

function where(arr, num) {
            arr.push(num);
            var i = 0,
                index = 0;
            for (; i < arr.length - 1; i++) {
                var j = i + 1;
                for (; j < arr.length; j++) {
                    if (arr[i] > arr[j]) {
                        var temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
            for (; index < arr.length; index++) {
                if (arr[index] == num) {
                    return index;
                }
            }
        }
        console.log(where([2, 20, 10], 19));

位移密碼算法挑戰

下面咱們來介紹風靡全球的凱撒密碼Caesar cipher,又叫移位密碼。
移位密碼也就是密碼中的字母會按照指定的數量來作移位。
一個常見的案例就是ROT13密碼,字母會移位13個位置。由'A' ↔ 'N', 'B' ↔'O',以此類推。
寫一個ROT13函數,實現輸入加密字符串,輸出解密字符串。
全部的字母都是大寫,不要轉化任何非字母形式的字符(例如:空格,標點符號),遇到這些特殊字符,跳過它們。

方法一:

function rot13(str) { // LBH QVQ VG!
            var arr = [];
            for (var index = 0; index < str.length; index++) {
                arr[index] = str.charCodeAt(index);
                if (arr[index] >= 65 && arr[index] <= 77) {
                    arr[index] += 13;
                }
                //字母爲26個當在字母末13個位,右移13位不是字母,應該進行左移、保證在字母26位裏。
                else if (arr[index] > 77 && arr[index] < 91)
                    arr[index] -= 13;
            }
            for (var i = 0; i < arr.length; i++) {
                arr[i] = String.fromCharCode(arr[i]);
            }
            return arr.join("");
        }
        // Change the inputs below to test
        console.log(rot13("SERR PBQR PNZC"));

方法二(提供者:沐辰樓-姬)

function rot13(str) {
            var a = [];
            for (var i = 0; i <
                str.length; i++) {
                a[i] = str.charCodeAt(i);
                if (a[i] >= 65 && a[i] <= 90) {
                    a[i] = a[i] + 13;
                    //優化處
                    if (a[i] > 90) {
                        a[i] = a[i] - 91 + 65;
                    }
                }
            }
            for (var j = 0; j <
                a.length; j++) {
                a[j] = String.fromCharCode(a[j]);
            }
            return a.join("");
        }

End

你們若是有更好的方法或者其餘解法歡迎補充和交流,可與我直接聯繫。

相關文章
相關標籤/搜索