最近收集了几个经典JS题目,比较有代表性,分享一下:
 
1.xiaoshuo-ss-sfff-fe  变为驼峰xiaoshuoSsSfffFe
function getCamelCase(str) {
    var arr = str.split( '-' );
    return arr.map( function( item, index ) {
        console.log(item)
        if( index === 0 ){
            return item;
        }else{
            return item.charAt(0).toUpperCase() + item.slice( 1 );
        }
    }).join('');
}
    console.log(getCamelCase("xiaoshuo-ss-sfff-fe"))
正则写法:
function getCamelCase( str ){
   return str.replace( /-([a-z])/g , function( all, i){    // 注意正则中的(),这里可以匹配到  -s 和s
                return i.toUpperCase();                        
       }   )
}
 如果这道题要求反向转化
function getCase(str) {
    var arr = str.split('');  // 每一个字符组成数组
    str = arr.map(function ( item ){
        if( item.toUpperCase() === item ){
            return '-' + item.toLowerCase();
        }else{
            return item;
        }
    }).join( '' );
    return str;
 
}
    console.log(getCamelCase("xiaoShuoWangXiao"))
正则写法
function getCase(){
  return str.replace( /[A-Z]/g  , function(i) {
       retrun '-' + i.toLowerCase();
  })
}
2.数组去重
ES6 set法:
var arry =[1,25,15,1,2,15,5,15,25,35,1]
var set =new Set(arry)
console.log([...set])
或者  简写为
[...new Set(arr)]
传统写法之一:
function qc(arr){
  var n = []; //一个新数组
  for(var i = 0;i<array.length;i++){         //也可以写x in array   x是迭代序号
      if(n.indexOf(array[i) === -1){  //检测到没有  则添加
           n.push(array[i)
        }
    }
   return n;
}
3.统计字符串中出现最多的字母
循环一下字符串,第一次出现
/**
* 获取字符串中出现次数最多的字母
* @param {String} str
*/
function getChar(str) {
    if (typeof str !== 'string') return // 判断参数是否为字符串
    const obj = new Object() // 键为字母,值为次数
    for (let i = 0; i < str.length; i ++) { // 遍历字符串每一个字母
        let char = str.charAt(i) // 当前字母
        obj[char] = obj[char] || 0 // 保证初始值为0
        obj[char] ++ // 次数加1
    }
    let maxChar // 存储字母
    let maxNum = 0 // maxChar字母对应的次数
    for(let key in obj) { // 遍历obj
        if (obj[key] > maxNum) {
            maxChar = key // 比较后存储次数多的字母
            maxNum = obj[key] // 以及它对应的次数
        }
    }
    return maxChar // 返回结果
}
 
let str = 'aabbbccdd'
console.log('出现次数最多的字母为:' + getChar(str))
4.字符串反序
首先将字符串序列化成数组,通过数组方法对数组反序,最后把数组转换成字符串。
'say I love U'.split('').reverse().join('')   //  U evol I yas
5.深拷贝
浅拷贝只需要Object.assign();
符合json要求(双引号)的对象深拷贝:
JSON.parse(JSON.stringify(obj)
不严格符合json的对象的深拷贝:
    function  deepCopy(src, r) {
        var r = r || {};
        for(var prop in src){
            // console.log(prop)
            if(typeof src[prop] === 'object'){ // 是对象  需要深拷贝
                if (src[prop].constructor === Array){
                    // console.log("数组");
                    r[prop]=[];
                }else{
                    // console.log("对象");
                    r[prop]={};
                }
                deepCopy(src[prop], r[prop]);
            }else{ // 非对象,直接拷贝
                r[prop] = src[prop];
            }
        }
        return r;
    }
6.合并多个有序数组
不考虑去重:
var arr = [[1, 2], [0, 3, 5], [-1, 4]];
arr = arr
.reduce((a, b) => a.concat(b), [])
.sort((a, b) => a - b); // 如果需要从小到大排序加上这个
 
console.log(arr);   //  输出 [-1, 0, 1, 2, 3, 4, 5]
考虑去重(数组转化为对象,利用对象键名唯一性,然后.keys一次性取键名)
var arr = [[1, 2], [0, 3, 5], [-1, 4]];
var obj = {};
 
arr = arr
    .forEach(item => item.forEach(function(num) {
        obj[num] = true;
    }));
arr = Object
    .keys(obj)
    .map(num => +num) // 这行主要是将键名取出来之后,数组中全部是字符串,将其都转成数字,以便后面排序
    .sort((a, b) => a - b);
 
console.log(arr);
7.数组排序
var arr = [1,25,3,85,4,0]
arr.sort((m,n)=>{
if(m>n){
     return 1       //顺序改变
  }else{
     return -1        //顺序不改变
  }
})
console.log(arr)  // [0, 1, 3, 4, 25, 85]
也可以简化为
var arr = [1,25,3,85,4,0]
arr.sort((m,n)=>{
if(m>n){
     return m-n   // m若大于n,m-n则是正数,反正是负数  和上面一样道理
  }})
console.log(arr)  // [0, 1, 3, 4, 25, 85]
同理:
[{'name': '张三', age: 16},{'name': '李四', age: 45},{'name': '王五', age: 19},{'name': '赵六', age: 6}]  按年龄排序
var arr = [{'name': '张三', age: 16},{'name': '李四', age: 45},{'name': '王五', age: 19},{'name': '赵六', age: 6}]
arr.sort((m,n)=>{
     if(m.age>n.age){
        return m.age-n.age
     }
})
console.log(arr)    // [{name: "赵六", age: 6},{name: "张三", age: 16},{name: "王五", age: 19},{name: "李四", age: 45}]
8.约瑟夫环问题
编号为1到100的一百个人围成一圈,以123123的方式进行报数,数到3的人自动退出圈子,剩下的人继续报数,问最后剩下的人编号为几?

递归解法:
参考:
根据这2篇文章可得到下面的思路:
设:n为总人数   报数出环数字为k(123123的3)  i为第i次出环
当i=1时,  f(n,k,i) = (n+k-1)%n
当i!=1时,  f(n,k,i)= ( f(n-1,k,i-1)+k )%n
简单来说, 这一轮=(上一轮+k)%n
按照这个公式,递归就很好写了。   
 
编号为1到100,报数逢3退出,注意解法中数组下标是从0开始的
     // 总人数n  报数出环数字k   n=100 k=3 第i个人出环
function josephus(n,k,i) {
if(i==1){
return (n+k-1)%n;
}else{
return (josephus(n-1, k,i-1) + k)%n;
}
}
for(var i=1;i<=100;i++){
console.log("第"+i+"次出环,下标为:"+josephus(100,3,i))
}
// 第100次:下标为90的人出环 他的编号是91 (别忘了加1)
 另一种解法:
这种方式比较简单,把编号组装为一个数组,设置一个浮标k,123的循环。每到3时将指向的值移除即可。
编号为1到100,报数逢3退出
     function josephus2 (n,k){
var players = [];
for(var i=1;i<=n;i++){ // 组成数组
players.push(i);
}
var flag=0;
while(players.length>1){
var outNum = 0; //本次循环已出局人数,便于定位元素位置
var len = players.length;
for(var i=0;i<len;i++){
flag++;
if(flag==k){
flag=0;
console.log("出局:"+players[i-outNum]+"本次循环已出局人数:"+outNum);
// i循环时受数组长度影响 每从头开始时i变为0; 但flag始终是123..k 123..k 固定循环,不受数组影响 ,
players.splice(i-outNum,1);
outNum++;
}
}
}
return players[0];
}
console.log(josephus2(100,3));
 

JS常见算法题目的更多相关文章

  1. C#常见算法题目(面试准备)

    1.写出冒泡,选择,插入排序算法.     //冒泡排序    public class bubblesorter    {        public void sort(int[] list)   ...

  2. Js常见算法实现汇总

    /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var ...

  3. js常见算法

    1:实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. function clone(Ob ...

  4. C#常见算法题目

        //冒泡排序    public class bubblesorter    {        public void sort(int[] list)        {            ...

  5. js常见算法(一)

    1.每个单词手字母大写 var capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase( ...

  6. 一些学习js的算法题目

    1.排序 问题描述 编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列. 输入格式:输入只有一行,即三个整数,中间用空格隔开. 输出格式:输出只有一行,即排序后的结果. 输入输出样 ...

  7. 19道常见的JS面试算法题

    最近秋招也做了多多少少的面试题,发现除了基础知识外,算法还是挺重要的.特意整理了一些常见的算法题,添加了自己的理解并实现. 除此之外,建议大家还可以刷刷<剑指offer>.此外,左神在牛客 ...

  8. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  9. iOS面试中常见的算法题目

    一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...

随机推荐

  1. SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis)

    SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis) 如果你使用的是 Intellij IDEA,请查看: SSM的配置流程详细的写了出来,方便很少 ...

  2. flask请求流程

  3. centos ntfs-3g 安装和使用

    安装fuse 下载fuse(ntfs-3g依赖fuse):http://vdisk.weibo.com/s/ajww5fZsUq50L?from=page_100505_profile&wvr ...

  4. GitHub初步探索-1-使用本地代码管理工具,简化上传的过程

    使用GitHub对于我们写Java的同志们来说是一个非常好的代码存储的方式,但是因为是全英文的,操作起来有一点复杂,所以我不是经常使用 ,但是最近代码越敲越多,再加上老师要求,希望使用比较简单的方法来 ...

  5. linux下部署redis

    基础知识: 1.Redis的数据类型: 字符串.列表(lists).集合(sets).有序集合(sorts sets).哈希表(hashs)2.Redis和memcache相比的独特之处: (1)re ...

  6. Mysql rpm安装

    总结下mysql rpm安装的方式,与一些错误 环境[root@host2 ~]# uname -aLinux host2 2.6.32-504.3.3.el6.x86_64 #1 SMP Wed D ...

  7. N点虚拟主机管理系统如何使用?

    有朋友问起N点虚拟主机管理系统怎么用呢?下面大概整理下他的使用方法,咱们来看看吧.          在讲如何使用N点虚拟主机管理系统之前,我们先来了解一下N点虚拟主机管理系统的介绍. ​     N ...

  8. 获取当前网页的的url

    如果测试的url地址是http://www.test.com/testweb/default.aspx, 结果如下: Request.ApplicationPath:                / ...

  9. Python学习---django模板语法180122

    django模板语法[Template] 模版的组成:  HTML代码+逻辑控制代码  <h1> {{ user_name }} </h1> 逻辑控制代码的组成: 1.变量: ...

  10. 【2017.10.13 ROS机器人操作系统】ROS系统常用术语及资源

    ROS机器人操作系统是一种后操作系统,提供了类似于软件开发中使用到的中间件的功能. ROS: Robot Operating System 机器人操作系统 Package: 功能包 Stack: 功能 ...