JS基础算法题(一)

1.1-寻找水仙花数

/**
* 水仙花数:是一个三位数,每一位的数字的三次方相加刚好等于自身
* 例如: 153 = 1*1*1 + 5*5*5 + 3*3*3
* = 1 + 125 + 27
* = 153
*
* 如何知道一个三位数的百位十位个位的数字?
* 例如:235
* 百位(除以一百取整): (1)235/100 = 2.35 (2)parseInt(2.35) = 2;
* 十位(除以10求模):(1)235/10 = 23.5 (2)parseInt(23.5)%10 = 3;
* 个位(模10): 235%10 = 5;
*
*/

/*思路分析:(1)遍历所有的三位数 100-999
(2)将每一位的数字三次方后相加判断是否是水仙花数
(3)如果是则打印这个数,然后继续寻找
(3.1)如果不是,则不打印继续寻找
*/

for(let i = 100;i <= 999;i++){//(1)循环所有的三位数

//2.判断是否是是水仙花数
let bai = parseInt(i / 100);	// i/100结果是小数,通过parseInt可以取整
let shi= parseInt(i / 10) % 10;
let ge = parseInt(i) % 10;

if(Math.pow(bai,3) + Math.pow(shi,3) + Math.pow(ge,3) == i){
//(3)如果是水仙花数则打印
console.log ( "找到一个水仙花数:" + i );
}

  

//3.1 继续寻找
}

第二种方法,采用字符串数组的方式

      for (let i = 100; i <= 999; i++) {
            var str = String(i);
            if ((Math.pow(str[0], 3) + Math.pow(str[1], 3) + Math.pow(str[2], 3)) == i) {
                document.write(i + "<br>");
            }
        }

1.2-农场繁殖

农场第一年有两头牛,每两头牛每一年可以生一头小牛,小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛

/**
* 农场第一年有两头牛,每两头牛每一年可以生一头小牛
* 小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛
* * 例如
* * 第一年:两头牛 1 + 1 = 2
* * 第二年: 三头牛 2 + 1 = 3(生一头)
* * 第三年 :四头牛 3 + 3/2 = 4(两头牛生小牛,另一头旁边观望学习经验)
* * 第四年: 六头牛 4 + 4/2 = 6(两对牛各生一头小牛)
* * 总结:每一年增加的小牛数是农场总牛数除以2的倍数(取整)
*/
//1.初始两头牛

let sum = 2;
//2.死循环(省略条件判断),不达到一千的产量誓不罢休
for(let i = 2;;i++){	//第二年开始生小牛,所以循环变量初始值是2
sum += parseInt(sum/2);
if(sum >= 1000){
console.log("第" + i + "年,牛的数量是" + sum);//第17年,牛的数量是1066

break;	//完成任务,停止循环
}
}

  

1.3-数组排序-冒泡算法

/*
冒泡算法(顺序:从小到大)
1.从第一个元素开始,比较下一个元素
* 如果前面一个大于后面的元素:交换
* 如果前面一个小于或者等于后面的元素:不用动
2.循环比较数组中的每一个元素:直到最大的那个元素到达数组最后

3.一次循环,只能得出最大的数据排到最后,因此需要根据数组元素的长度来进行循环嵌套
* 一次只能让当前最大的到最后(如果原来最大的就在最后,那么就是次大的)
* 根据数组长度实现:每次都能得出一个最大,直到全部都排好序
*/

// 定义一个无序数组
let arr = [3,5,1,8,6,2];

// 外部循环:决定里面循环的次数
for(let i = 0;i < arr.length;i++){
// 内部循环:决定当前最大的元素跑到正确的位置去
for(let j = 0;j < arr.length - 1;j++){
// j < arr.length - 1 是因为需要进行向后一个进行元素匹配

// 判定当前元素与后一个元素的关系:前面大于后面:交换(其他情况不用变)
if(arr[j] > arr[j+1]){
// 交换两个元素的值:采用第三个变量
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}

console.log(arr);	// [1,2,3,5,6,8]

  

1.4-对象经典面试题

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //有一个字符串数组,找出出现次数最多的字符及对应的次数
        let str = ['a', 'b', 'a', 's', 'f', 'g', 'g', 'g', 'h', 'j', 'j', 'k', 'k', 'g', 'f', 'd', 'd', 's', 's', 's', 's', 's', '3', '4', '4', '4', '3', '4', '3'];
        /*思路:
            利用对象两个特点
                属性可以动态添加=
                属性与属性值之间是一个键值对的关系
           1.声明一个空对象,遍历字符串
           2.将字符串的字符作为对象的属性,出现的次数作为对象的属性值
        */

        let objc = {};
        for (let i = 0; i < str.length; i++) {
            let s = str[i];
            //先判断对象是否有该属性
            if (objc[s] == undefined) {//使用字符串语法对对象取值,如果取出来是undefined,表示对象没有这个属性
                //既然没有表示这个字符是第一次出现,那么就将这个字符作为对象的属性,属性的值为1 (第一次出现)
                objc[s] = 1;//动态赋值
            } else {//如果对象有这个属性,则让这个属性的值自身+1  (每出现一次就加1)
                objc[s]++;
            }
        }
        console.log(objc);//遍历这个对象,就知道哪个字符出现的最多了
        var max = 0;
        var maxstr = "";
        for (let key in obj) {
            if (max < obj[key]) {
                max = obj[key];
                maxstr = key;
            }
        }
        console.log(`字符串中出现次数最多的字符位${maxstr},其一共出现了${max}次`);
    </script>
</body>

</html>

  1.5以下题目为循环嵌套题目

1.5.1 大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配?(★★★)

     //驮100石粮食,大马需要50匹
              for(var a=0;a<=50;a++){
                  //驮100石粮食,中马需要100匹
                   for(var b=0;b<=100;b++){
                       //驮100石粮食,只需要100减去大马和中马的数量就是小马的数量
                       var c=100-a-b;
                       if((a+b+c==100) && (2*a+b+c/2==100)){
                           document.write("大马:"+a+"中马:"+b+"小马:"+c+"<hr />");
                       }
                  }
            

 15.2 .小明单位发了100元的购物卡,小明到超市买三类洗化用品,洗发水(15元),香皂(2元),牙刷(5元)。要把100元整好花掉,可如有哪些购买结合?(★★★★)

 //a=洗发水,b=香皂,c=牙刷
           //100元可以买6瓶洗发水
            for(var a=0;a<=6;a++){
                //100元可以买50块香皂
                for(var b=0;b<=50;b++){
                    //100元可以买20个牙刷
                    for(var c=0;c<=20;c++){
                        //条件
                        if(15*a+2*b+5*c==100){
                            document.write("洗发水:"+a+"香皂:"+b+"牙刷:"+c+"<hr />");
                        }
                    }
                }
            }

 

posted @ 2020-08-11 17:09  pongx_20  阅读(442)  评论(0编辑  收藏  举报