最近收集了几个经典 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 到 30 的三十个人围成一圈, 以 123123 的方式进行报数, 数到 3 的人自动退出圈子, 剩下的人继续报数, 问最后剩下的人编号为几?
递归解法:
参考:
- http://tingyun.site/2018/04/26/约瑟夫环问题详解/
- https://www.cnblogs.com/zjfjava/p/5994437.html
根据这 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
按照这个公式, 递归就很好写了.
JS 写法:
- // 总人数 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)
来源: https://www.cnblogs.com/dmcl/p/9204168.html