最近在考虑面试,自己就总结了一些js算法题,希望对正在找工作的你也有帮助
1、es6方法过滤掉两个数组中对象id值相等的项
function(arr1,arr2){
arr1.filter((item) => !arr2.some((ele) => ele.id == item.id))
}
2、判断是否回文
//如:字符串abccba,从前往后读是a-b-c-c-b-a;从后往前读也是a-b-c-c-b-a
function reserve1(str){
return str == str.split('').reverse().join('')
}
function reserve2(str){
var len = str.length;
for(var i=0;i<len-1;i++){
if(str.charAt(i)==str.charAt(len-1-i)){
return true;
}else{
return false;
}
}
}
//console.log(reserve2('abac'))
3、数组去重
function unique(arr){
let newArr = []
arr.forEach((val)=>{
if(newArr.indexOf(val) == -1){
newArr.push(val)
}
})
return newArr
}
var arr = [1,3,4,8,1,9]
//console.log(unique(arr))
4、尾递归阶乘
function factorial(num) {
if(num <= 1) return 1;
return num * factorial(num - 1);
}
5、排序
//快速排序
function quickSort(arr){
if(arr.length<=1)return arr;
let middleIndex = Math.floor(arr.length/2)
//console.log(middleIndex)
let middle = arr.splice(middleIndex,1)[0]
console.log(middle)
let left = [],right = []
for(var i=0;i<arr.length;i++){
if(arr[i]>middle){
right.push(arr[i])
}else{
left.push(arr[i])
}
}
return quickSort(left).concat([middle],quickSort(right));
}
console.log(quickSort([2,3,1,4,6,5,9,8,7]))
//冒泡排序
function maopao(arr){
if(arr==null || arr.length < 2 ){
return;
}
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
return arr
}
var arr = [89,63,78,12,458,24,76,3,49]
console.log(maopao(arr))
6、 统计字符串出现次数最多的字母
function findMoreLetter(str){
var arr,container = {}
arr = str.split('')
for(var i=0;i<arr.length;i++){
if(container[arr[i]]){
container[arr[i]] ++
}else{
container[arr[i]] = 1
}
}
// 通过比较找出最大的
var maxKey = 0,maxValue = '';
for (let k in container) {
if(container[k] > maxKey){
maxKey = container[k];
maxValue = k;
}
}
return maxValue+'最多出现了'+maxKey+'次'
}
var str = 'abbbuyymmckhdtgdj'
//console.log(findMoreLetter(str))
7、自己定义的new方法
let newMethod = function(fun, ...rest){
// 1.以构造器的prototype属性为原型,创建新对象;
let child = Object.create(fun.prototype);
// 2.将this和调用参数传给构造器执行
fun.apply(child, rest);
// 3.返回第一步的对象
return child;
};
8、不借助临时变量,进行两个整数的交换
//方法一
function swap(a , b) {
b = b - a;//2
a = a + b;//10
b = a - b;//8
return [a,b];
}
//console.log(swap(8,10))
方法二
[a,b] = [b,a]
9、找出下列正数组的最大差值
var arr2 = [10,5,11,7,8,9]
function findMaxProfit(arr){
var max = arr[0];
var min = arr[1]
for(var i=0;i<arr.length;i++){
if(arr[i]>max){
max = arr[i]
}
if(arr[i]<min){
max = min
}
}
return max - min
}
//console.log(findMaxProfit(arr2));
10、随机生成指定长度的字符串,实现一个算法,随机生成指制定长度的字符窜 比如给定 长度 8 输出 4ldkfg9j
function randomString(n){
let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
let temp = '';
for(var i=0;i<n;i++){
temp += str.charAt(Math.floor(Math.random()*str.length))
}
return temp
}
//console.log(randomString(10))
11、 定义一个函数 求a所有约数之和
function yueShuHe(a) {
var sum = 0;// 累加器
for(var i=1; i<a; i++) {
if(a%i==0) {
sum = sum + i;
}
}
return sum;
}
12、找亲密数
for(var num1 = 1; num1<=3000; num1++) {
var num2 = yueShuHe(num1);
if(num1==yueShuHe(num2) && num1 != num2) {
console.log(num1,num2);
}
}
13、输入一个3位数,求这个数的和
function sumNumber(num){
var bai,shi,ge,sum
bai = parseInt(num/100)
shi = parseInt(num/10)%100
ge = num%10
sum = bai + ge + shi;
return sum;
}
14、写出代码对下列数组去重并从大到小排列{5,2,3,6,8,6,5,4,7,1,9}
function fn(arr){
var arr1 = []
for(var i=0;i<arr.length;i++){
if(arr1.indexOf(arr[i])==-1){
arr1.push(arr[i])
}
}
return arr1.sort().join(',')
}
// var arr = [5,2,3,6,8,6,5,4,7,1,9]
// console.log(fn(arr))
15.用 JavaScript 实现冒泡排序。数据为 23、45、18、37、92、13、24
function maoPaoSort(arr){
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
return arr.toString()
}
//console.log(maoPaoSort([23,45,18,37,92,13,24]));
16、用 js 实现随机选取 10–100 之间的 10 个数字,存入一个数组,并排序。
function randomNumberSort(len,max,min){
var transition = max - min + 1;//这里面的加1是为了能够取到100
var arr = []
for(var i = 0; i < len; i++){
var num = Math.floor(Math.random() * transition + min);
arr.push(num)
}
arr = arr.sort()
return arr;
}
console.log(randomNumberSort(10,100,10))
17、已知数组 var stringArray = [“This”, “is”, “Baidu”, “Campus”], Alert 出”This is Baidu Campus”。
var stringArray = ["This", "is", "Baidu", "Campus"]
//console.log(stringArray.join(" "))
18、已知有字符串 foo=”get-element-by-id”,写一个 function 将其转化成 驼峰表示法”getElementById”。
var foo ="get-element-by-id"
var arrFoo = foo.split('-')
for(var i=0;i<arrFoo.length;i++){
arrFoo[i] = arrFoo[i].charAt(0).toUpperCase()+arrFoo[i].substr(1,arrFoo[i].length-1)
}
var msg = arrFoo.join('')
console.log(msg)
19、下面这段 JS 输出什么,并简述为什么?
function Foo() {
var k = 0;
return function () {
console.log(k++);
}}
var f1 = Foo(), f2 = Foo();
// f1()
// f1()
// f2()
// console.log(k)
20、有这样一个 URL: http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一 段 JS 程序提取 URL 中的各个 GET 参数(参数名和参数个数不确定),将其按 key-value 形式返回到一个 json 结构中,如{a:’1′, b:’2′, c:”, d:’ xxx’, e:undefined}。
function serilizeUrl(url){
if(url.indexOf('?')==-1){
return;
}
var urlObject = {};
var urlString = url.substring(url.indexOf('?')+1)
var urlArr = urlString.split('&')
for(var i=0;i<urlArr.length;i++){
var urlItem = urlArr[i];
var item = urlItem.split("=");
urlObject[item[0]] = item[1];
}
return urlObject
}
// var url = 'http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e';
// console.log(serilizeUrl(url))
21、输出今天的日期,以 YYYY-MM-DD 的方式,比如今天是 2014 年 9 月 26 日,则输出 2014-09-26
function getToday(){
var date = new Date()
var year = date.getFullYear()
var month = date.getMonth()+1
month = month < 10 ? '0' + month : month
var day = date.getDate()
day = day < 10 ? '0' + day : day
return `今天是${year}年${month}月${day}日`
}
//console.log(getToday())
// Console.log(undefined || 1);//值___1__
// Console.log(null || NaN);//值__NaN___
// Console.log(0 && 1);//值__0___
// Console.log(0 && 1 || 0);//值__0___
22、以下 js 的运行结果是什么,为什么?
var txt='hx';
function hello(){
var txt;
fn();//world 函数名与变量名重复的时候,以函数名为主
var fn=function(){
console.log('hello')
}
function fn(){
console.log('world');
}
console.log(txt);//undefined 局部变量,只是声明,没有赋值
fn();//hello 先进行声明,后赋值,执行 fn=function(){alert('hello')}
}
//hello();
23、把两个数组合并,并删除第二个元素。
var array1 = ['a','b','c'];
var bArray = ['d','e','f'];
var carray = array1.concat(bArray)
carray.splice(1,1)
//console.log(carray)
24、写一个 function,清除字符串前后的空格。(兼容所有浏览器)
function trim(str){
str.replace(/^\s+/, "").replace(/\s+$/,"");
// if (!String.prototype.trim) {
// String.prototype.trim = function() {
// return this.replace(/^\s+/, "").replace(/\s+$/,"");
// }}
// }
}
var arr = new Array(1 ,3 ,5);
arr[4]='z';
arr2 = arr.reverse();
arr3 = arr.concat(arr2);
//console.log(arr3);
25、数字转换成千分位 如:12,876,977.98
方法一:function RMB(number){
var list = number.toString().split('').reverse()
var obj =[];
for(var i=0;i<arr.length;i++){
if(i%3==0 && i!=0){
obj.push(',')
}
obj.push(arr[i])
}
return obj.reverse().join('')
}
方法二 : function convert(number){
var list = number.toString().split('').reserve()
for(var i=0;i<list.length;i++){
if(i%4 === 3){
list.splice(i,0,',')
}
}
return list.reverse().join('')
}
准备一个月份反转的数组
var _date=[],dateData=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"];
var dateDataRet = Object.assign([],dateData).reverse();
//获取当前年份
var yearText= new Date().getFullYear();
var now = new Date().getMonth();
for (let i=0;i<6;i++){
if(now-i<0){
_date.push(yearText-1+'年'+dateDataRet[Math.abs(now-i)-1]);
}else{
_date.push(yearText+'年'+dateData[now-i]);
}
}
_date.reverse()
console.log(_date)
26、获取url中的参数,并返回一个对象{key:value}格式
let urlStr = 'http://www.inode.club?name=koala&study=js&study=node'
function queryString(url){
let params = url.split('?')[1];
let param = params.split('&')
// console.log(param)
let obj = {}
for(var i=0;i<param.length;i++){
let paramA = param[i].split('=')
// console.log(paramA)
let key = paramA[0]
let value = paramA[1]
if(obj[key]){
obj[key] = Array.isArray(obj[key])?obj[key]:[obj[key]];
obj[key].push(value);
}else{
obj[key] = value
}
}
return obj;
}