JavaScript算法题整理

JavaScript算法题整理1.获得两个数相除的商和余数console.log(10/3);//商:3.3333console.log(10%3);//余数:1//获得两个数相除的商和余数console.log(Math.floor(10/3));//13//Math.floor(向下取整)、Math.ceil(向上取整)、round(四舍五入)console.log(0.1+0.2);//在js中,尽量避免做小数点运算//如果有小数位的运算varsum=(0.1*100+0.2*100)/100;c

大家好,又见面了,我是你们的朋友全栈君。

1.获得两个数相除的商和余数

console.log(10/3); //商:3.3333
console.log(10%3);//余数:1
//获得两个数相除的商和余数
console.log(Math.floor(10/3)); //1 3
  //Math.floor(向下取整)、Math.ceil(向上取整)、round(四舍五入)
console.log(0.1+0.2);//在js中,尽量避免做小数点运算
//如果有小数位的运算
var sum = (0.1*100+0.2*100)/100;
console.log(sum); //0.3

//其他数据类型---》数值类型:
   "null/false/''  --> 0
    undefined/object/'aaaaa'-->NaN
    '123' '0123'-->123  10进制   
    '0x133'-->16进制
console.log(123+"123");//123123  字符串的拼接运算
console.log(123-"123");//0    隐式的数据类型转换 string-->number
console.log(-null);-0
console.log(-undefined);//NaN
console.log(-true,-false);//-1 -0
console.log(-"123");//-123
console.log(-"",-"abc",-"123abc",-"0123",-"0x12");//-0 NaN NaN -123 -18(十六进制)

2.递增递减操作符

var a=10;
	var b=a++;//b=10 a=11
	var c=++a;//a=12 c=12
	var d=--a;//a=11 d=11
	var e=a--;//e=11 a=10
	console.log(a,b,c,d,e);
	//console.log(++c---a+b--); //js error 语法错误

3.人民币大小写

  //1.验证数据的合法性
	//2.业务处理
	var num='';
	if(typeof num=='number' && num>=0 && num<=10){ 
   
	    if(num==0) console.log('零');
			else if(num==1) console.log('壹');
			else if(num==2) console.log('贰');
			else if(num==3) console.log('叁');
			else if(num==4) console.log('肆');
			else if(num==5) console.log('伍');
			else if(num==6) console.log('陆');
			else if(num==7) console.log('柒');
			else if(num==8) console.log('捌');
			else if(num==9) console.log('玖');
		    else console.log('拾'); //else if(num==10) console.log('拾');
	    }else{ 
   
		console.log('非法数值');
	}
	console.log('over');//结束执行
//数据不合法的情况
	if(!(typeof num=='number')){ 
   
		console.log('非数值类型的');
		//return;在函数中的话有return
	}else if(num<0 ||  num>10){ 
   //else if(!(num>=0 && num<=10))
		console.log('不是指定数字');
		//return;
	}
	if(num==0){ 
   console.log('壹');}
    else if(num==1){ 
   }

    else if(num==10){ 
   }

四、判断成年人和未成年人,以及成年人可以执行后序工作

function isCheng(age){ 
   
	//验证数据的合法性
	if(typeof age=='number' && age>0 && age<200){ 
   
		if(age>18){ 
   
			console.log("是成年人");
		}else{ 
   
			console.log("未成年人");
			return;//判断结束,跳出循环 return后面不一定有值
		}
	}else{ 
     //非法数值
		return;//跳出循环,不在执行后面的
	}
	//后续业务处理--比如:办信用卡
	console.log("办信用卡");
}
	//测试
	isCheng('abc');//非法数值
	isCheng(300);//非法数值
	isCheng(20);//是成年人 办信用卡
	isCheng(10);//未成年人
	//注意:一个函数中可以出现多次return,就算连着出现两个return都不会报错,但只会执行第一个return。

五、函数与普通变量提升的区别

普通变量提升<函数提升

  console.log(print);// 全文查找print 发现它是一个函数,输出[Function print]
  print();//调用函数
  console.log(foo);// 全文查找print 发现它是一个值 但具体值不知道 输出undefined 
  //foo(); error! 此时foo不是一个函数
  function print(){ 
   console.log('print');}
  var foo=function(){ 
   console.log('foo');}

比如:下面看这个笔试题

	console.log(say);//[Function say]
	say();//可以执行 say
	function say(){ 
   console.log('say')};//函数
	var say='name';
	console.log(say);//name
	//say();//error!

六、10的阶乘

1.使用arguments方法:

	function result(num){ 
   
	        if(num<=1){ 
   
	           return 1;
	        }else{ 
   
	           return num*arguments.callee(num-1);
	        }
	}
	console.log("递归方法10!的结果为: "+result(10));

2.for循环(do…while 和while同理)

	var result=1;
	for(var i=1;i<11;i++){ 
   
	        result=result*i;
	}
	console.log("10的阶乘为:"+result);
	//循环的三要素:初始值、判断条件(结束条件)、迭代器(条件对应的值发生改变)

七、arguments练习

	// 求任意个数值的和
		function add(){ 
   
	        var result = 0;
			for(var key in arguments){ 
   
				result += arguments[key];
			}
			return result;
		}
		console.log(add(1,2,3,4,5));

八、this练习

例题1
	//var name='zs';//文件内的全局 name='zs' this.name=undefined
	name='zs';//运行环境的全局 node global
	function say(){ 
   
		//console.log(this.name,name);//undefined zs
		console.log(name,this.name);//zs zs
	}
	say();
例题2
	var age=100;//文件
    function print(){ 
   
	  var age=200;//函数
	  console.log(age,this.age);//函数 运行环境(node) //第一个age就近取 第二个还未定义,所以结果是undefined
	                            //age 取数原则: 先就近取--》函数内取---》文件内取----》全局取
}
    print();
	var classmate='haha';
	var stu={ 
   
		classmate:'wwwww',
		tell:function(){ 
   
			//console.log(classmate); 本函数-》文件内-》全局 
			console.log(classmate,stu.classmate,this.classmate);//haha wwwww wwwww
		}
	};
	//tell(); error! //此时的tell依赖于stu存在的,不能直接这样写
	stu.tell();
	console.log(stu.classmate);//wwwww
	var s1=stu;//传值
例题3
	//var name ='zs'; //如果用var 此时下面的name就是undefined
	name='zs';
	function sayName(){ 
   
		console.log('函数内:',this.name);// 这里的this.name = xx.name
	}
	var p1={ 
   
		name:'terry',
		//sayName:sayName 相当与sayName1(key和value的值相等,可以只写一个)
		sayName
	};
	var p2={ 
   
		name:'robin',
		sn:sayName
	};
	var p3={ 
   
		sayName
	}
	p1.sayName();//terry
	p2.sn();//robin
	sayName();//zs
	p3.sayName();//undefined 等价于 console.log(p3.name);

九、九九乘法表

在vim编辑器实现99乘法表,效果图如下:

//正序
	var a="";
	for(var i=1;i<=9;i++){ 
    //倒99 for(var i=9;i>=1;i++)
	    for(var j=1;j<=i;j++){ 
   
	       if(i*j>9){ 
   
	            a+=j+"*"+i+"="+i*j+" ";
	       }else{ 
   
	            a+=j+"*"+i+"="+i*j+" ";
	       }
	        if(i==j){ 
   
	                a+="\n";
	        }
	    }
	}
	console.log(a);

99乘法表

十、重复数

例题:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

	var num=0//三位数
	var count=0;//数量
	// 1.先把三位数都列举出来,筛选
	for(var i=1;i<5;i++){ 
   
	   for(var j=1;j<5;j++){ 
   
	      for(var k=1;k<=4;k++){ 
   
	          if(i!=j&&j!=k&&k!=i){ 
   
	             num=i*100+j*10+k;
	             console.log(num);
	             count++;
	          }   
	      }   
	   }   
	}
	console.log("count="+count);//count=24

十一、素数

例题:判断101-200之间有多少个素数,并输出所有素数(只能被1和它本身整除的自然数为素数)

	var count=0;
	for(var i=101;i<200;i+=2){ 
   //偶数能被2整除,肯定不是素数
	    for(var j=2;j<=i;j++){ 
   
	       if(i%j==0 && i!=j) break;//结束内层循环,外层的i肯定不是素数
	       else if(i%j==0){ 
   //或者条件写 i==j都行
	          console.log(i);//打印该素数
	          count++;
	       }   
	   }   
	}
	console.log("prime number between 101 and 200 total count="+count);//count=21

十二、水仙花数

例题:打印出所有的水仙花数,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

//方法一:
	var a=0,b=0,c=0;
	for(var i=100;i<=999;i++){ 
   
	     a=parseInt(i/100); //parseInt 解析字符串,并返回整型
	     b=parseInt(i%100/10);
	     c=i%10;
	     if((Math.pow(a,3)+Math.pow(b,3)+Math.pow(c,3))==i){ 
    //Math.pow(a,b)表示a的b次幂
	          console.log(i);
	     }       
	}
//方法二:
	var num=0;
	for(var i=1;i<=9;i++){ 
   
	  for(var j=0;j<=9;j++){ 
   
	      for(var k=0;k<=9;k++){ 
   
	         num=i*100+j*10+k;
	         //if((Math.pow(i,3)+Math.pow(j,3)+Math.pow(k,3))==num)
	         if((i*i*i+j*j*j+k*k*k)==num){ 
   
	              console.log(num);
	         }   
	      }   
	  }   
   }

十三、正因式分解

例题:将一个正整数分解质因数。例如:输入90,打印出90=233*5。

/* 对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 1.如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 2.如果n不等于k,k能被n整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。 提示:如果一个自然数能写成两个自然数的乘积,那么这两个自然数就叫作原来那个数的因数。 */
   function divide(num){ 
    
        if(typeof num != 'number'){ 
   
             console.log("Please input one number");
             return;
        }
        var result=num+"="
        var k=2;
        while(k!=num){ 
   
             if(num%k==0){ 
   
                 result+=k+"*";  
                 num=num/k;
                 k=1;//因为if后面有k++,之后起始值还是k=2
             }
             k++;
        }       
        result+=k;
        console.log(result);
 }
 divide(90);
 divide(9);

十四、公约数

例题:求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)

辗转相除法的算法为:首先将 m除以 n(m>n)得余数 r,再用余数 r 去除原来的除数,得新的余数,重复此过程直到余数为0时停止,此时的除数就是m 和 n的最大公约数。求 m和 n的最小公倍数: m和 n的积除以(m和 n 的最大公约数)。

 function deal(num1,num2){ 
   
        num1=parseInt(num1);
        num2=parseInt(num2);
        var a=num1,b=num2,c=0;
        while(b!=0){ 
   
                c=a%b;//c为两个数的余数
                a=b;//被除数作为新的除数
                b=c;//余数作为新的被除数
        }
        var gcd=a;//此时的除数就是最大公约数
        var lcm=num1*num2/gcd;//最小公倍数
        console.log(num1+"和"+num2+"的最大公约数是"+gcd+",最小公倍数是"+lcm);
 }
 deal(25,10);

十五、完全数

例题求1000以内的完全数(若一个自然数,恰好与除去它本身以外的一切因数的和相等,这种数叫做完全数。)
例如,6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124
先计算所选取的整数a(a的取值1~1000)的因数,将各因数累加于m,若m等于a,则可确认a为完全数。

//1000以内求完全数
	var result="";
	for(var i=1;i<1000;i++){ 
   
	        var sum=0;
	        //循环求因子,并且累加
	        for(var j=1;j<=i/2;j++){ 
   
	                if(i%j==0) sum+=j;
	        }
	        //判断因子之和是否等于数字本身
	        if(sum==i) result+=i+"\t";
	}
	console.log(result);

十六、计算累加阶乘

输出结果为 1!+2!+3!+4!+5!+6! = xxx

//方法一:
	function addAndMul(num){ 
   
		var addResult = 0;
		var str = '';   //就是拼接的字符串 1!+2!+3!+4!+5!+6! = 
		for(var i=1;i<=num;i++){ 
   
			//拼接字符串
			str += i == num?i+'!=':i+'!+';
			//计算i的阶乘
			var mulResult = 1;
			for(var j=i;j>0;j--){ 
   
				mulResult *= j;
			}
			addResult += mulResult;
		}
		var result = str + addResult;
		console.log(result);
	}
	addAndMul(6);
//方法二:
	function addFun(num){ 
   
		var result = 0;
		var str = '';
		if(num>=1){ 
   
			for(var i=1;i<=num;i++){ 
   
				str += i==num?i+'!=':i+'!+';
				//result += mulFun(i);
				result += Digui(i);
			}
			console.log(str+result);
		}else{ 
   
			console.log('请输入大于1的数值进行累加阶乘');	
		}
	}
	addFun(10);

十七、数组最大差值

方法一

Array.prototype.outputMaxPrice  = function outputMaxPrice (array) { 
   
    /* 求一组数中最大值和最小值直接使用内置对象函数Math中的min()和max()方法即可。 注意,apply方法的第二个参数必须是一个数组,第二个参数用来替换原函数的参数 apply用于更改this指向,但这道题我们是不需要的,我们只需要将math.max及math.min应用到数组上即可 */
      const item1 = Math.max.apply( null, array );
      const item2 = Math.min.apply( null, array );
        // const item1 = Math.max(10,5,11,7,8,9);
        // const item2 = Math.min(10,5,11,7,8,9);
    
      return item1 - item2;
    }
    
    const array = new Array;//创建实例
    var arr = [10,5,11,7,8,9]
    
    var result = array.outputMaxPrice (arr)   // 6
    console.log(result);

方法二
数组最大差值

十八、 数组去重

数组去重
注意:数组的十大经典算法,可以参照:https://www.jianshu.com/p/5c894e8b1f88

十九、排序

1.冒泡排序Bubble Sort

思路:
	1.比较相邻的元素。如果第一个比第二个大,就需要互相交换。 
​	2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 
​	3.针对所有的元素重复以上的步骤,除了最后一个。 
​	4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
具体实现:
    let arr=[5,2,3,4,1];
    // 第一轮比较:2,3,4,1,5
	// 第二轮比较:2,3,1,4,5
	// 第三轮比较:2,1,3,4,5
	// 第四轮比较:1,2,3,4,5
    let bubbleSort=(arr)=>{ 
   
        // 控制比较的轮数
        for(i=0;i<arr.length-1;i++){ 
   
          //控制每轮的比较 这里用到的arr.length-i-1,是减少了一步操作,起到优化项目的作用。
           for(j=0;j<arr.length-i-1;j++){ 
   
           //当前项>下一项 ---》交换
                if(arr[j]>arr[j+1]){ 
   
                    let temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp
                }
            }   
        }
        return arr;
    }
    console.log(bubbleSort(arr));

2.选择排序 select Sort

思路:
	第一次从待排序的数组元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余
的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数
据元素的个数为零。选择排序是不稳定的排序方法。
	let arr=[15,32,6,3,46,2,14,5,1];
	let selectSort=(arr)=>{ 
   
	    for(i=0;i<arr.length-1;i++){ 
   
	        let temp=i;
	        for(j=i+1;j<arr.length;j++){ 
   
	        //当前项<前一项 arr[j]表示当前项 arr[temp]前一项
	            if(arr[j]<arr[temp]){ 
   
	                let swap = arr[j];
	                arr[j]=arr[temp];
	                arr[temp]=swap;
	            }
	        }
	    }
	    return arr;
	}
	console.log(selectSort(arr));

3.插入排序 insert Sort

思路:
	插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素
除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在
第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
	插入排序的基本思想是:每步将一个待排序的记录,按其值的大小插入前面已经排序的数据中适
当位置上,直到全部插入完为止。
	let arr=[12,5,3,7,8,1,6,4];
	let insertSort=(arr)=>{ 
   
	    for(i=0;i<arr.length-1;i++){ 
     //n-1个数已经排好序
	        for(j=i+1;j>0;j--){ 
   	//n个数插入到前面的有序数列中
	            if(arr[j]>arr[j-1]){ 
    //后一项小于前一项,需要交换位置
	                let temp=arr[j];
	                arr[j]=arr[j-1];
	                arr[j-1]=temp;
	            }
	        }
	    }
	    return arr
	}
	console.log(insertSort(arr));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147539.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号