js_部分面试题(五)

2019-02-08  本文已影响2人  mao77_

js_部分面试题(四)

1. 判断价格;

    <body>
        <select id="month">
            <!--option[value=$]{$月份}*12-->
            <option value="1">1月份</option>
            <option value="2">2月份</option>
            <option value="3">3月份</option>
            <option value="4">4月份</option>
            <option value="5">5月份</option>
            <option value="6">6月份</option>
            <option value="7">7月份</option>
            <option value="8">8月份</option>
            <option value="9">9月份</option>
            <option value="10">10月份</option>
            <option value="11">11月份</option>
            <option value="12">12月份</option>
        </select>
        <select id="cw">
            <option value="jingji">经济舱</option>
            <option value="toudeng">头等舱</option>
        </select>
        <button id="btn">计算票价</button>
        <p id="price"></p>
        
        
    <script>
        // 1. 先判断月份
        // 2. 在判断舱位
        // -------------
        // 先把JS的代码中用到的元素找出来
        var selMonth = document.getElementById("month");
        var selCW = document.getElementById("cw");
        var btn = document.getElementById("btn");
        var P = document.getElementById("price");
        var initPrice = 4000;  //存储原始价格
        var price;  //计算出来的最终的价格
    
        // 点击计算票价的按钮之后去计算,事件
        btn.onclick = function () {
            //写如何计算的代码
            var month = +selMonth.value; //获取用户选择的月份
            var cw = selCW.value; //获取用户选择的舱位
            var discount;  //表示折扣
    
            if(month >= 4 && month <= 10){
                if(cw == "toudeng"){
                    // price = initPrice * 0.9;
                    discount = 0.9;
    
                }else {
                    // price = initPrice * 0.75;
                    discount = 0.75;
                }
            }else{
                if(cw == "toudeng"){
                    // price = initPrice * 0.6;
                    discount = 0.6;
                }else {
                    // price = initPrice * 0.3;
                    discount = 0.3;
                }
            }
            price = initPrice * discount;
            // console.log(price);
            P.innerHTML = "你选择的舱位是:"+ cw + ",选择的月份是:"+ month + ",最终的价格是:" + price;
        }
    </script>

2. 写素数

    var min = 2;
    var max = 1000;
    var sum = 0;
    var index = 0;  // 用来计数
    for(var num = min; num <= max; num++){
        // 2 3 4 5 ... 10000
        // 计算 num是不是质数
        var flag = true; // true表示是质数
        
        for(var i = 2, v = Math.sqrt(num); i <= v; i++){
            if(num % i == 0){
                flag = false;
                break;  // 结束离他最近的那个
            }
        }
        if(flag){
            document.write(num + " ");
            index++;
            sum += num;
            if(index % 6 == 0){
                document.write("<br>");
            }
            /*if(index == 5){
                document.write("<br>");
                index = 0;
            }*/
        }
    }
    document.write("<br>" + sum)
    
    </script>
    </body>
    </html>
    <!--
    在页面中输出 2 - 10000之间所有的素数,
    并在最后计算出来这些素数的和.
    
    -->

3. 在页面上输出100到1000之间既是3的倍数又是5的倍数的数字。

    var m = 8909;
    var n = 18020;
    // 计算最大公约数
    var min = m < n ? m : n;
    for (var i = min; i > 0; i--){
        if (m % i == 0 && n % i == 0){
            console.log(m + "和" + n + "的最大公约数是:" + i);
            break;
        }
    }
    
    // 计算最小公倍数
    var max = m > n ? m : n;
    for (var i = max; ; i++){
        if (i % m == 0 && i % n == 0){
            console.log(m + "和" + n + "的最小公倍数是:" + i);
            break;
        }
    }

4. 计算两个数的最大公约数和最小公倍数

    // 4. 求1!+2!+3!+...+10!的和。
    var num = 10;
    var sum = 0;
    var sumJc = 1;

    for(var j=1; j<=num; j++){
        sumJc *= j;
        // console.log(sumJc);
        sum += sumJc;
    }
    document.write("和为:" + sum);
    
    //---------------------------
    
    var num = 10;  // 1!+...10!
    var sum = 0;
    for (var i = 1; i <= num; i++){
        // 循环内部计算i的阶乘
        var ji = 1;
        for (var j = i; j >= 1; j--){
            ji *= j;
        }
        sum += ji;
    }
    console.log(sum);

5. 对一个整数分解质因数。例如: 90 = 2 * 3 * 3 * 5

    //5. 对一个整数分解质因数。例如: 900 = 2 * 2 *
    var num = 90098090;
    var temp = num;
    var msg = num + " = ";
    for (var i = 2; i <= temp; i++){
        if (temp % i == 0){
            if (i == temp){ // 最后一次的时候不要再添加 * 号
                msg += i;
            }else{
                msg += i + " * ";
            }
            temp = temp / i;
            i--;
        }
    }
    console.log(msg);
    
    //------------------------------------
    
    var num = prompt("请输入一个整数:");

    if(num>1){
        document.write(num+"=");
        for(var i=2; i<=num; i++){
            if(i == num){
                document.write(num);
                break;
            }else if(num % i == 0){
                num /= i;
                document.write(i + " * " );
                i--;
            }
        }
    }

6. 在页面中显示出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。

    for(var num = 100; num < 1000; num++){
        var ge = num  % 10;
        var shi = parseInt(num / 10) % 10;
        var bai = parseInt(num / 100);
        if(ge ** 3 + shi ** 3 + bai ** 3 === num){
            console.log(num);
        }
    }

7. 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。 例如6=1+2+3.编程找出1000以内的所有完数。

    var max = 100000;
    for(var i = 2; i < max; i++){
        // 计算i的因子, 得到这些因字的和
        var sum = 0;
        for(var j = 1; j < i; j++){
            if(i % j == 0){
                sum += j;
            }
        }
        if(sum == i){
            console.log("完数:" + i);
        }
        
    }

8. 小游戏——猜数字

    while (true){
        var num = parseInt(Math.random()*101);
        while (true){
            var guess = prompt("请输入你猜的数字:范围在0-100");
            if(guess == num){
                alert("恭喜你,猜对啦");
                break;
            }else if(guess > num){
                alert("你猜大啦");
            }else {
                alert("你猜小了啦");
            }
        }
        var again = confirm("是否再来一局呢");
        if(!again){
            alert("欢迎下次再来");
            break;
        }else {
            alert("游戏即将开局,请做好准备");
        }
    }

9. 猴子分桃

    var peach = 6;  // 桃子初始量
    var monkeyCount = 5;  //五只猴
    var success = false;

    for(; ; peach += 5){
        var temp = peach;
        for(var monkey=1; monkey<=monkeyCount; monkey++){
            if(temp % 5 == 1){
                if(monkey == monkeyCount){
                    success = true;
                    break;
                }
                temp = ((temp - 1)/5 * 4);
            }else {
                break;
            }
        }
        if(success){
            console.log(peach);
            break;
        }
    }

10. 定义函数,输入年份,判断年份是否是闰年

    function isLeap(year){
        return year % 4 ==0 && year % 100 != 0 || year % 400 == 0;
        /*if( year % 4 ==0 && year % 100 != 0 || year % 400 == 0){
            return true;
        }else{
            return false;
        }*/
    }

11. 定义函数,打印1999--2050年中间所有的闰年。(借用第一题的封装好的函数)

    function printAllLeap(from, to){
        for(var year = from; year <= to; year++){
            if(isLeap(year)){
                document.write(year + " ");
            }
        }
    }

12. 定义函数,输入一个日期,判断该日期是否合法;例如:输入 2015-2-29不合法。

    function isLegal(year, month, day){
        // 把一些明显不合法的先拦截掉
        if(month > 12 || month < 1 || day > 31 || day < 1) return false;
        // day [1,31]
        if(month == 4 || month == 6 || month == 9 || month == 11){
            return day <= 30;
        }else if(month == 2){
            if(isLeap(year)){
                return day <= 29;
            }else{
                return day <= 28;
            }
        }
        return true;
    }

13. 棋盘上的麦

    function chess(i) {
        if(i == 1 ) return 1;
        return Math.pow(2, i-1) + chess(i-1);
    }
    console.log(chess(64));


    // 求每格应该放多少
    function countPer(n){
        if(n == 1) return 1;
        return 2 * countPer(n-1);
    }
    //求所有格的和
    function sum(n){
        if(n == 1) return 1;
        return countPer(n) + sum(n-1);
    }

14. 定义函数: 计算斐波那契数列第n项

    function rabbitCount(j) {
        if(j==1 || j==2) return 1;
        return rabbitCount(j-1) + rabbitCount(j-2);
    }

    console.log(rabbitCount(30));
    
    //-------------------------------
    
    // function list(j) {
    //     var n1 = 1;
    //     var n2 = 1;
    //     for(var i=3; i<=j; i++){
    //         var temp = n2;
    //         n2 = n1 + n2;
    //         n1 = temp;
    //     }
    //     return n2;
    // }
    
    //--------------------
    
    function rabbitCount(n){
        if(n == 1 || n == 2) return 1;
        var a = 1;
        var b = 1;
        var count;
        for(var i=3; i<=n; i++){
            count = a + b;
            a = b;
            b = count;
        }
        return count;
    }

15. 定义函数, 根据传入的年月日,返回这个年月日是那一年的第几天

    function isLeap(year) {
        return year%4==0 && year%100!=0 || year%400==0;
    }

    function fate(year, month){
        if(month==4 || month==6 || month==9 || month==11){
            return 30;
        }else if(month == 2){
            if(isLeap(year)){
                return 29;
            }       
            return 28;
        }
        return 31;
    }

    function howDays(year, month, day){
        for(var i=month-1; i>0; i--){
            day += fate(year, i);
        }
        return day;
    }

    console.log(howDays(2018, 3, 31));

    //-----------------------------------------------------      
    
    function isLeap(year){
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }
    function isLegal(year, month, day){
        // 把一些明显不合法的先拦截掉
        if (month > 12 || month < 1 || day > 31 || day < 1) return false;
        // day [1,31]
        if (month == 4 || month == 6 || month == 9 || month == 11){
            return day <= 30;
        }else if (month == 2){
            if (isLeap(year)){
                return day <= 29;
            }else{
                return day <= 28;
            }
        }
        return true;
    }
    
    function dayPerYear(year, month, day){ // 2018, 3, 30
        if(!isLegal(year, month, day)) return -1;
        if(month == 1) return day;
        return day + sumDays(year, month - 1) // 2018, 2
    }
    // 求前 month个月的总天数
    function sumDays(year, month){  // 2018, 5
        if(month == 1) return 31;
        return sumDays(year, month - 1) + days(year, month);
    }
    // 求第month个月的天数
    function days(year, month){
        if(month == 9 || month == 4 || month == 6 || month == 11){
            return 30;
        }else if(month == 2){
            if(isLeap(year)){
                return 29;
            }
            return 28;
        }
        return 31;
    }

16. 读取学生的10门课的成绩, 然后输出10门课成绩的最高分, 最低分, 总分, 平均分.提示:把10门课的成绩保存如一个数组中.

    // var arr = [];
    // var sum = 0;
    // while(true){
    //     var temp = +prompt("请输入成绩(0-100)");
    //     if(temp>=0 && temp<=100){
    //         arr[arr.length] = temp;
    //         if(arr.length === 10){
    //             break;
    //         }
    //     }else {
    //         alert("输入错误,请重新输入");
    //     }
    // }
    //
    // var maxScore = arr[0];
    // var minScore = arr[0];
    // for(var j=0; j<arr.length; j++){
    //     sum += arr[j];
    //     if(arr[j] > maxScore){
    //         maxScore = arr[j];
    //     }
    //     if(arr[j] < minScore){
    //         minScore = arr[i];
    //     }
    // }
    // console.log("总分为:" + sum);
    // var avg = sum/arr.length;
    // console.log("平均分为:" + avg);
    // console.log("最高分为:" + maxScore);
    // console.log("最低分为:" + minScore);

    //-------------------------------------------------------------------------

    function Student(){
        this.scores = [];
        this.init = function(){
            for(var i=0; i<3; i++){
                var score = +prompt("请输入");
                this.scores.push(score);
            }
        };
        this.max = function(){
            var scores = this.scores;
            var m = scores[0];
            for(var i=1; i<scores.length; i++){
                if(m < scores[i]){
                    m = scores[i];
                }
            }
            return m;
        };
        this.sum = function(){
            var s = 0;
            for(var e of this.scores){
                s += e;
            }
            return s;
        };
        this.avg = function(){
            return this.sum()/this.scores.length;
        }
    }
    var si = new Student();
    si.init();

17. 创建100个随机的10到60的随机整数, 然后分别统计每个数字出现的次数

    // var max = 60;
    // var min = 10;
    // var arr = [];
    // for(var i=0; i<100; i++){
    //     var num = parseInt(Math.random() * (max-min+1) + min);
    //     arr[i] = num;
    // }
    // var obj = {};
    // for(var j=0; j<arr.length; j++){
    //     if(obj[arr[j]]){
    //         obj[arr[j]] += 1;
    //     }else {
    //         obj[arr[j]] = 1;
    //     }
    // }
    // console.table(obj);
    // for(var e in obj){
    //     console.log(e, obj[e]);
    //     document.write(e + "出现了" + obj[e] + "次" + "<br>");
    // }

    //-------------------------------------------------------------------

    //区间[m, n]
    //获得随机区间数
    function randomInt(m, n){
        return parseInt(Math.random() * (n-m+1) + m);
    }
    //创建一个长度是count,元素的值的范围是[m, n]的数组
    function createArray(count, m, n){
        var arr = [];
        for(var i=0; i<count; i++){
            arr.push(randomInt(m,n));
        }
        return arr;
    }
    function statistics(){
        var obj = {};
        var arr = createArray(400, 10, 60);
        for(var num = 10; num<=19; num++){
            var c = 0;
            for(var e of arr){
                if(e == num){
                    c++;
                }
            }
            // console.log(num + "的个数是" + c);
            obj[num + ""] = c;
        }
        return obj;
    }
    var result = statistics();
    console.log(result["10"]);
    console.log(result);

18. 定义一个函数, 判断数组中是否所有的数字都大于0提示: 传入一个数组, 返回布尔值

    var arr = [10, 20, -1, 30, 50];
    function isAllGTZero(arr){
        for(var i=0; i<arr.length; i++){
            if(arr[i] <= 0){
                return false;
            }
        }
        return true;
    }

19. 封装函数: 把两个数组共同的元素放入一个新的数组, 并返回新的数组,提示: 传入两个数组, 返回值为新的数组

    // var arr = [1,2,3,4,5,6];
    // var arr1 = [2,3,4,5,6,7,8,9];
    // console.log(newAry(arr, arr1));
    //
    // function newAry(array1, array2){
    //     var newArr = [];
    //     for(var i=0; i<array1.length; i++){
    //         for(var j=0; j<array2.length; j++){
    //             if(array1[i] === array2[j]){
    //                 newArr[newArr.length] = array1[i];
    //             }
    //         }
    //     }
    //     return newArr;
    //
    // }

    //-----------------------------------------------------------------------

    function commonEle(arr1, arr2){
        var arr = [];
        for(var i=0; i<arr1.length; i++){
            var num = arr1[i];
            for(var e of arr2){
                if(num == e){
                    arr.push(num);
                }
            }
        }
        return arr;
    }
    var a = commonEle([1, 2, 3, 3], [10, 2, 3]);
    console.log(a);

20. 定义一个函数: 可以把数组中的下标为 3 的元素移到数组的开头.提示: 传入一个数组

    // var arr = [11,22,33,44,55,66,77,88,99];
    // console.log(drift(arr));
    //
    // function drift(array) {
    //     array.unshift(+(array.splice(3, 1)));
    //     return arr;
    // }

    //----------------------------

    //把数组中的下标为i的元素移动到下标为j的位置。
    function changeIndex(arr, i, j){
        var a = arr.splice(i, 1);
        arr.splice(j, 0, a[0]);
        return arr;
    }

    console.log(changeIndex([10, 20, 30, 40], 3, 1));

21. 有一个从大到小排好序的数组{99,85,82,63,60}。现从页面输入一个数,要求按原来的规律将它插入数组中。假设你输入的80,则应该插入到82和63之间。

    function insert(arr, num){
        for(var i=0; i<arr.length; i++){
            if(arr[i] < num){
                arr.splice(i, 0, num);
                return;
            }
        }
        arr.push(num);
    }
    var arr = [99, 85, 82, 63, 60];
    insert(arr, 80);
    console.log(arr);

22. 一个数字中有20个元素,对前10个元素使用升序,后10个元素使用降序。元素都是整数。

    // var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    // console.log(sequence(arr));
    //
    // function sequence(array){
    //     var newArr = array.splice(10);
    //     array.sort(function (a, b) { return a-b });
    //     newArr.sort(function (a, b) { return b-a });
    //     return array.concat(newArr);
    // }

    //------------------------------------------------------------------------------------------------

    var arr = [1,2,3,4,5,6,7,8,9,10];
    function mySort(arr){
        var a1 = arr.slice(0, 5);
        var a2 = arr.slice(5);
        a1.sort(function(a,b){return a-b});
        a2.sort(function(a,b){return b-a});
        arr.splice(0, arr.length);
        // arr.push(...a1.concat(a2));//...展开运算符
        Array.prototype.push.apply(arr, a1.concat(a2))  //ES6借调
    }

    console.log(arr);

23. 传入任意字符串,统计字符串中的大写字母个数、小写字母个数、数字个数、其他字符个数。

    function counts(s){
        // 大写字母的个数, 小写字母的的个数, 数字的个数, 其他字符的个数
        // var cs = [0, 0, 0, 0];
        var cs = {
            upperCase: 0,
            lowerCase: 0,
            number: 0,
            other: 0
        }
        for (var c of s){
            if (c >= "A" && c <= "Z"){
                // cs[0]++;
                cs.upperCase++;
            }else if (c >= "a" && c <= "z"){
                // cs[1]++;
                cs.lowerCase++;
            }else if (c >= "0" && c <= "9"){
                // cs[2]++;
                cs.number++;
            }else{
                // cs[3]++;
                cs.other++;
            }
        }
        return cs;
    }
    
    console.log(counts("fAKJHKHKHKIfjlasdjfoeur93932980?..,,uui]]][[\\"));

24. 去除字符串首尾空格.(写一个自定义的 trim 函数, 不能使用s.trim())

    function myTrim(s){
        var start, end;
        for (var i = 0; i < s.length; i++){
            if (s[i] != " " && s[i] != "\n" && s[i] != "\t"){
                start = i;
                break;
            }
        }
        for (var i = s.length - 1; i >= 0; i--){
            if (s[i] != " " && s[i] != "\n" && s[i] != "\t"){
                end = i + 1;
                break;
            }
        }
        // return s.substring(start, end);
        return s.slice(start, end);
    }
    
    console.log("zzz" + myTrim("   \n \t ldfjlsdjfabc  sdlfjdls\n   \t   ") + "zzz");

25. 验证字符串:长度4-16; 只能包含数字、英文字符、下划线三种符号; 首字符不能是数字";

    function validate(s){
        // 先把一些不满足的给排除掉, 可以最大限度的降低嵌套
        // 如果长度小于4或者小于16 直接认为验证没有通过
        if (s.length < 4 || s.length > 16) return false;
        if (s[0] >= "0" && s[0] <= "9") return false;
    
        for (var c of s){
            if (!((c >= "0" && c <= "9")
                    || (c.toLowerCase() >= "a" && c.toLowerCase() <= "z")
                    || (c == "_"))){
                return false;
            }
        }
        return true;
    }
    
    console.log(validate("abc1你好"));

26. 创建一个长度为5-10, 内容为数字字母下滑线的随机字符串.

    console.log(create());

    function create(){
        var arr = [];
        for(var i=0; i<10; i++){
            arr.push(i + "");
        }
        for(var i=97, z="z".charCodeAt(0); i<=z; i++){ 
            arr.push(String.fromCharCode(i));
            arr.push(String.fromCharCode(i-32));
        }
        arr.push("_");
        var s = "";
        for(var i=0; i<randomInt(5, 10); i++){
            s += arr[randomInt(0, arr.length-1)];
        }
        return s;
    }

    function randomInt(m, n){
        return parseInt(Math.random() * (n-m+1) + m);
    }

27. 将字符中单词用空格隔开,已知传入的字符串中只有字母,每个单词的首字母大写,请将每个单词用空格隔开,只保留第一个单词的首字母大写

     传入:"HelloMyWorld"  // Hello m
     返回:"Hello my world"
    function foo(s){
       /* for (var i = 1; i < s.length; i++){
            if (s[i] >= "A" && s[i] <= "Z"){
                s = s.replace(s[i], " " + s[i].toLowerCase());
            }
        }
        return s;*/
        
        var temp = "";
        var start = 0;  // 每次截取的开始的位置
        for (var i = 1; i < s.length; i++){
            if (s[i] >= "A" && s[i] <= "Z"){  // M
                temp += s.slice(start, i) + " " + s[i].toLowerCase();
                start = i + 1;
            }
        }
        temp += s.slice(start);
        return temp;
    }
    console.log(foo("HelloHyHorld"));
上一篇下一篇

猜你喜欢

热点阅读