W3Cschool——初級(jí)腳本算法題

JS-train

前言

偶然看到W3Cschool上有個(gè)編程挑戰(zhàn)瞧柔,里面的題目前是面向前端方面的造锅,也有一些算法和數(shù)據(jù)結(jié)構(gòu)的題在哥蔚,我花了兩天的時(shí)間把16道初級(jí)腳本算法的題完成并做一個(gè)思路分享,從中有一定的收獲深夯,題目從實(shí)際出發(fā)咕晋,需要靈活運(yùn)用各個(gè)JS對(duì)象的屬性和方法才能完成掌呜,反復(fù)的加深了我對(duì)這些方法的認(rèn)識(shí)和理解以及運(yùn)用质蕉,也鍛煉了我的邏輯思維能力殊霞。做這些題確實(shí)很有幫助绷蹲,以后有時(shí)間每天再去做一兩道中級(jí)的祝钢,最后再整理出來(lái)把我的解法和思路與大家共享。

翻轉(zhuǎn)字符串

先把字符串轉(zhuǎn)化成數(shù)組疤估,再借助數(shù)組的reverse方法翻轉(zhuǎn)數(shù)組順序铃拇,最后把數(shù)組轉(zhuǎn)化成字符串沈撞。
你的結(jié)果必須得是一個(gè)字符串

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

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

知識(shí)點(diǎn):

  1. split() 把字符串分割為字符串?dāng)?shù)組显晶。
  2. reverse() 反轉(zhuǎn)數(shù)組的元素順序磷雇。
  3. join() 把數(shù)組轉(zhuǎn)換為字符串倦春,并返回結(jié)果尿庐。

階乘算法挑戰(zhàn)

計(jì)算一個(gè)整數(shù)的階乘
如果用字母n來(lái)代表一個(gè)整數(shù)抄瑟,階乘代表著所有小于或等于n的整數(shù)的乘積。

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

        }
        console.log(factorialize(0));

回文算法挑戰(zhàn)

如果一個(gè)字符串忽略標(biāo)點(diǎn)符號(hào)惹资、大小寫和空格褪测,正著讀和反著讀一模一樣,那么這個(gè)字符串就是palindrome(回文)乖杠。

  1. 你需要去掉字符串多余的標(biāo)點(diǎn)符號(hào)和空格
  2. 然后把字符串轉(zhuǎn)化成小寫來(lái)驗(yàn)證此字符串是否為回文畏吓。
function palindrome(str) {
            //傳入字符串處理
            var newstr = str.replace(/[^0-9a-z]/gi, "");
            newstr = newstr.toLowerCase();
            // // 方法一
            // //轉(zhuǎn)換成數(shù)組并進(jìn)行反向排序
            // var arr = newstr.split("");
            // arr.reverse();
            // //把排序后的轉(zhuǎn)換為字符串進(jìn)行全等判斷
            // arr = arr.join("");
            // if (newstr === arr) {
            //     return true;
            // } else {
            //     return false;
            // }
            //方法二 從字符串頭部和尾部卫漫,逐次向中間檢測(cè)
            for (var i = 0, j = newstr.length - 1; i < j; i++, j--) {
                //這里注意下庵佣,for循環(huán)內(nèi)部只判斷不符合要求的,
                //如果循環(huán)后都沒(méi)返回false就在for外部返回true汛兜,不要在內(nèi)部直接返回true或提前出來(lái)
                if (newstr.charAt(i) !== newstr.charAt(j)) {
                    return false;
                }
            }

            return true;
        }


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

尋找最長(zhǎng)的單詞算法挑戰(zhàn)

找到提供的句子中最長(zhǎng)的單詞,并計(jì)算它的長(zhǎng)度通今。
函數(shù)的返回值應(yīng)該是一個(gè)數(shù)字粥谬。

function findLongestWord(str) {
            var arr = str.split(" "),
                i = 0,
                maxLengthNum = 0;
            // var index = i + 1;
            //方法一:復(fù)雜化方法:冒泡排序解法(直接第一個(gè)想到就是這個(gè),就順著來(lái)做了辫塌,發(fā)現(xiàn)復(fù)雜化漏策,
            //只需要把數(shù)組長(zhǎng)度和最大值取出來(lái)做比較就行了)
            //     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;

            //方法二:取出數(shù)組長(zhǎng)度值與歷史最大值比較,第一個(gè)默認(rèn)為起始最大值
            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");

設(shè)置首字母大寫算法挑戰(zhàn)

確保字符串的每個(gè)單詞首字母都大寫,其余部分小寫。

//方法一:復(fù)雜化,沒(méi)有使用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;
        // }
        //方法二:簡(jiǎn)單化用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");

尋找數(shù)組中的最大值算法挑戰(zhàn)

右邊大數(shù)組中包含了4個(gè)小數(shù)組,分別找到每個(gè)小數(shù)組中的最大值砸捏,然后把它們串聯(lián)起來(lái)掂骏,形成一個(gè)新數(shù)組田绑。

方法一:

function largestOfFour(arr) {
            var i = 0,
                j = 0,
                maxArr = [];
            for (; i < arr.length; i++) {
                var max = 0; //內(nèi)部循環(huán)后民逼,比較值要清空一次映屋。
                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對(duì)象的max方法取值優(yōu)化內(nèi)部循環(huán)性能
                      maxArr[i]=Math.max(maxArr[i],arr[i][j]);
                    }
                }
            }
            return maxArr;
        }

確認(rèn)末尾字符算法挑戰(zhàn)

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

  //方法一:使用lastIndexOf從最后開(kāi)始查找,并返回對(duì)應(yīng)的起始位置到其索引,再做比較嚷往,indexOf也可實(shí)現(xiàn)返回索引
        // function confirmEnding(str, target) {
        //     var index = str.lastIndexOf(target);
        //     return index == str.length - target.length;
        // }
        //方法二:使用substr抽取出字符趋急,用負(fù)數(shù)來(lái)實(shí)現(xiàn)從末尾抽對(duì)應(yīng)的查詢字符的長(zhǎng)度
        //如果查找的字符實(shí)在最后出現(xiàn),則抽取出來(lái)的應(yīng)該和需要查找的一樣侥祭,同理slice也可以實(shí)現(xiàn)提取
        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"));

重復(fù)操作算法挑戰(zhàn)

重復(fù)一個(gè)指定的字符串 num次,如果num是一個(gè)負(fù)數(shù)則返回一個(gè)空字符串。


  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));

字符串截取算法挑戰(zhàn)

如果字符串的長(zhǎng)度比指定的參數(shù)num長(zhǎng)趾撵,則把多余的部分用...來(lái)表示。切記赶站,插入到字符串尾部的三個(gè)點(diǎn)號(hào)也會(huì)計(jì)入字符串的長(zhǎng)度瑟蜈。但是,如果指定的參數(shù)num小于或等于3,則添加的三個(gè)點(diǎn)號(hào)不會(huì)計(jì)入字符串的長(zhǎng)度狼讨。

        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));

數(shù)組分割算法挑戰(zhàn)

猴子吃香蕉可是掰成好幾段來(lái)吃哦!
把一個(gè)數(shù)組arr按照指定的數(shù)組大小size分割成若干個(gè)數(shù)組塊。
例如: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));

數(shù)組截?cái)嗨惴ㄌ魬?zhàn)

返回一個(gè)數(shù)組被截?cái)鄋個(gè)元素后還剩余的元素筝蚕,截?cái)鄰乃饕?開(kāi)始坯沪。
方法一:

          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++) {
                //使用數(shù)組對(duì)象shift()方法藻糖,把數(shù)組的第一個(gè)元素從其中刪除巨柒,并返回第一個(gè)元素的值禽最。
                arr.shift();
            }
            return arr;
        }

數(shù)組查詢算法挑戰(zhàn)

蛤蟆可以吃隊(duì)友疹味,也可以吃對(duì)手憎夷。
如果數(shù)組第一個(gè)字符串元素包含了第二個(gè)字符串元素的所有字符,函數(shù)返回true拾给。
舉例祥得,["hello", "Hello"]應(yīng)該返回true,因?yàn)樵诤雎源笮懙那闆r下蒋得,第二個(gè)字符串的所有字符都可以在第一個(gè)字符串找到啃沪。["hello", "hey"]應(yīng)該返回false,因?yàn)樽址?hello"并不包含字符"y"窄锅。["Alien", "line"]應(yīng)該返回true创千,因?yàn)?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"]));

刪除數(shù)組中特定值算法挑戰(zhàn)

刪除數(shù)組中的所有假值入偷。
在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);
                    //保證刪除數(shù)組元素后丙曙,索引不跳過(guò)下一個(gè)
                    index--; 
                }
            }
            return arr;
        }
        console.log(bouncer([7, "ate", "", false, 9]));

去除數(shù)組中任意多個(gè)值算法挑戰(zhàn)

實(shí)現(xiàn)一個(gè)摧毀(destroyer)函數(shù),第一個(gè)參數(shù)是待摧毀的數(shù)組其骄,其余的參數(shù)是待摧毀的值亏镰。

  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));

數(shù)組排序并插入值算法挑戰(zhàn)

先給數(shù)組排序,然后找到指定的值在數(shù)組的位置拯爽,最后返回位置對(duì)應(yīng)的索引索抓。
舉例:where([1,2,3,4], 1.5) 應(yīng)該返回 1。因?yàn)?.5插入到數(shù)組[1,2,3,4]后變成[1,1.5,2,3,4],而1.5對(duì)應(yīng)的索引值就是1逼肯。
同理耸黑,where([20,3,5], 19) 應(yīng)該返回 2。因?yàn)閿?shù)組會(huì)先排序?yàn)?[3,5,20]篮幢,19插入到數(shù)組[3,5,20]后變成[3,5,19,20]大刊,而19對(duì)應(yīng)的索引值就是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));

位移密碼算法挑戰(zhàn)

下面我們來(lái)介紹風(fēng)靡全球的凱撒密碼Caesar cipher三椿,又叫移位密碼奈揍。
移位密碼也就是密碼中的字母會(huì)按照指定的數(shù)量來(lái)做移位。
一個(gè)常見(jiàn)的案例就是ROT13密碼赋续,字母會(huì)移位13個(gè)位置。由'A' ? 'N', 'B' ?'O'另患,以此類推纽乱。
寫一個(gè)ROT13函數(shù),實(shí)現(xiàn)輸入加密字符串昆箕,輸出解密字符串鸦列。
所有的字母都是大寫,不要轉(zhuǎn)化任何非字母形式的字符(例如:空格鹏倘,標(biāo)點(diǎn)符號(hào))薯嗤,遇到這些特殊字符,跳過(guò)它們纤泵。

方法一:

        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個(gè)當(dāng)在字母末13個(gè)位骆姐,右移13位不是字母,應(yīng)該進(jìn)行左移捏题、保證在字母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;
                    //優(yōu)化處
                    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

大家如果有更好的方法或者其他解法歡迎補(bǔ)充和交流,可與我直接聯(lián)系公荧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末带射,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子循狰,更是在濱河造成了極大的恐慌窟社,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绪钥,死亡現(xiàn)場(chǎng)離奇詭異灿里,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)程腹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門钠四,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事缀去÷略睿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵缕碎,是天一觀的道長(zhǎng)褥影。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咏雌,這世上最難降的妖魔是什么凡怎? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赊抖,結(jié)果婚禮上统倒,老公的妹妹穿的比我還像新娘。我一直安慰自己氛雪,他們只是感情好房匆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著报亩,像睡著了一般浴鸿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弦追,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天岳链,我揣著相機(jī)與錄音,去河邊找鬼劲件。 笑死掸哑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的零远。 我是一名探鬼主播举户,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遍烦!你這毒婦竟也來(lái)了俭嘁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤服猪,失蹤者是張志新(化名)和其女友劉穎供填,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罢猪,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡近她,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膳帕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘捎。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薇缅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攒磨,到底是詐尸還是另有隱情泳桦,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布娩缰,位于F島的核電站灸撰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拼坎。R本人自食惡果不足惜浮毯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泰鸡。 院中可真熱鬧债蓝,春花似錦、人聲如沸盛龄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讯嫂。三九已至,卻和暖如春兆沙,著一層夾襖步出監(jiān)牢的瞬間欧芽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工葛圃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留千扔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓库正,卻偏偏與公主長(zhǎng)得像曲楚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褥符,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容