前端刷题 —— 牛客网前端题库60道详解(六)

目录

  • 引言javascript

    1. 乘法 (入门)
    2. 改变上下文 (入门)
    3. 批量改变对象的属性 (入门)
    4. 属性遍历 (简单)
    5. 判断是否包含数字 (入门)
    6. 检查重复字符串 (简单)
    7. 判断是否以元音字母结尾 (入门)
    8. 获取指定字符串 (简单)
    9. 判断是否符合指定格式 (简单)
    10. 判断是否符合 USD 格式 (中等)

引言

牛客网这个前端笔试题库,能够说这60道是最基础的了,也是考察的东西比较杂,有时间4天差很少就能够刷完,巩固基础仍是有些用的。作完题回顾一上午就能够过完一遍。如今我结合个人答案和参考的其余人的答案,在这里作一个总结,也是本身知识的整理结果。前端

51. 乘法

题目描述
求 a 和 b 相乘的值,a 和 b 多是小数,须要注意结果的精度问题
输入:3, 0.0001
输出:0.0003java

// 方法一:肯定小数的位数而后保证精度是多少位
function multiply(a, b) {
    let arrA = a.toString().split('.')[1] || ''
    let arrB = b.toString().split('.')[1] || ''
    let fix = arrA.length + arrB.length
    return (a * b).toFixed(fix)
}

// 方法二:本身写的
function multiply(a, b) {
    let arrA = a.toString().split('.')
    let arrB = b.toString().split('.')
    let count = 0
    // 第一个有小数位
    if(arrA[1]) {
        count+=arrA.length
        a = a * Math.pow(10,arrA.length)
    }
    // 第二个数有小数位
    if(arrB[1]) {
        count+=arrB.length
        b = b * Math.pow(10,arrB.length)
    }
    return a * b * Math.pow(10, -count)
}
复制代码

相关知识点:算法

  • javascript小数精度问题

javascript的数值存储是双精度浮点数64位,根据IEEE 754标准,0-51为值,52-62位指数,63位是符号位。
二进制浮点数表示法对0.1这样的有偏差。
解决方法就是先升幂再降幂。数组

52. 改变上下文

题目描述
将函数 fn 的执行上下文改成 obj,返回 fn 执行后的值
输入: alterContext(function() {return this.greeting + ', ' + this.name + '!'; }, {name: 'Rebecca', greeting: 'Yo' })
输出:Yo, Rebecca!markdown

// 方法一:call
function alterContext(fn, obj) {
    return fn.call(obj)
}

// 方法一:apply
function alterContext(fn, obj) {
    return fn.apply(obj)
}

// 方法一:bind
function alterContext(fn, obj) {
    return fn.bind(obj)()
}
复制代码

相关知识点:app

  • call/apply/bind

53. 批量改变对象的属性

题目描述
给定一个构造函数 constructor,请完成 alterObjects 方法,将 constructor 的全部实例的 greeting 属性指向给定的 greeting 变量。
输入:函数

var C = function(name) {this.name = name; return this;};   
var obj1 = new C('Rebecca');   
alterObjects(C, 'What\'s up'); obj1.greeting;  
复制代码

输出:What's upoop

// 方法一:原型对象上添加属性
function alterObjects(constructor, greeting) {
    constructor.prototype.greeting = greeting
}

复制代码

相关知识点:post

  • 原型链

54. 属性遍历

题目描述
找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~)
一、返回数组,格式为 key: value
二、结果数组不要求顺序
输入

var C = function() {this.foo = 'bar'; this.baz = 'bim';}; 
C.prototype.bop = 'bip'; 
iterate(new C());
复制代码

输出 ["foo: bar", "baz: bim"]

// 方法一: forEach换成map更好,这里不是重点因此不作处理
function iterate(obj) {
    let arr = []
    Object.getOwnPropertyNames(obj).forEach(value => arr.push(`${value}: ${obj[value]}`))
    return arr
}
复制代码

相关知识点:

  • Object.getOwnPropertyNames(obj), 获取全部的对象自身属性

55. 判断是否包含数字

题目描述
给定字符串 str,检查其是否包含数字,包含返回 true,不然返回 false
输入: 'abc123' ; 输出: true

// 方法一:字符串比较ASCII码
function containsNumber(str) {
    for (let i = 0; i < str.length; i++) {
        if(str[i] >= '0' && str[i] <= '9') {
            return true
        }
    }
    return false
}

// 方法二:隐式类型转化
function containsNumber(str) {
    for (let i = 0; i < str.length; i++) {
        if(str[i] >= 0 || str[i] <= 9) {
            return true
        }
    }
    return false
}

// 方法三:正则
function containsNumber(str) {
    return /\d/g.test(str)
}
复制代码

相关知识点:

  • 字符串比较ASCII码

字符串比较会比较他们的ASCII码值,数字是连续的ASCII码,0123456789分别是48-57,在这个范围内的就能够。

  • 隐式类型转化

数字字符串和数字比较,会隐式转化成数字,字符串和数字比较,会转化成数字NaN,和数字比较返回false,因此这种方式也能够找到字符串中是否有数字。

  • 正则

56. 检查重复字符串

题目描述
给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,不然返回 false
输入: 'rattler'
输出: true

// 方法一:双指针
function containsRepeatingLetter(str) {
    // 若是字符串长度小于2直接返回false
    if(str.length < 2)return false
    // 左右指针
    let left = 0
    let right = 1
    while(str[right]) {
        // 若是左右相等且都是a-z范围的就返回true
        if(str[left++] === str[right++] && str[left].toLowerCase() >= 'a' && str[left].toLowerCase() <= 'z' && str[right].toLowerCase() >= 'a' && str[right].toLowerCase() <= 'z'){
            return true
        }
    }
    // 不然返回false
    return false
    
}

// 方法二:正则,小括号表示分组,\1表示引用第一个分组
function containsRepeatingLetter(str) {
    return /([a-zA-Z])\1/.test(str);
}

复制代码

相关知识点:

  • 双指针(算法思惟)
  • 正则

57. 判断是否以元音字母结尾

题目描述
给定字符串 str,检查其是否以元音字母结尾
一、元音字母包括 a,e,i,o,u,以及对应的大写
二、包含返回 true,不然返回 false
输入: 'gorilla' ; 输出: true

// 方法一:indexOf
function endsWithVowel(str) {
    return ['a','e','i','o','u'].indexOf(str.slice(-1).toLowerCase()) === -1 ? false: true
}

// 方法二:includes
function endsWithVowel(str) {
    return ['a','e','i','o','u'].includes(str.slice(-1).toLowerCase())
}
复制代码

相关知识点:

  • 字符串方法slice,toLowerCase
  • 数组方法indexOf,includes

58. 获取指定字符串

题目描述
给定字符串 str,检查其是否包含 连续3个数字
一、若是包含,返回最早出现的 3 个数字的字符串
二、若是不包含,返回 false
输入: '9876543'
输出: 987

PS: 这个题咱们理解的是三个连续递增的数字,可是题的意思是连续的数字便可。

// 方法一:计数器
function captureThreeNumbers(str) {
  let start = 0
  let count = 0
  for(let i = 0; i < str.length; i++) {
    if (!isNaN(str[i])) {
      count++
    } else {
      count = 0
      start = i+1
    }
  }
  
  return count >= 3 ? str[start]+str[start+1]+str[start+2] : false
}

// 方法二:正则 match能够获得匹配的结果
function captureThreeNumbers(str) {
  let arr = str.match(/\d{3}/)
  return arr ? arr[0] : false
}
复制代码

若是是连续递增的数字,要这样实现:

// 方法一:双指针
function captureThreeNumbers(str) {
    let left = 0
    let right = 0
    while(str[right+1] !== undefined) {
        // 保证右指针连续,且属于数字,右指针往过移动
        if(Math.abs(str[right+1] - str[right]) === 1 && str[right] >=0 && str[right] <=9) {
            right++
        // 若是小于3,左指针就去右指针右边
        }else if(right - left + 1 < 3){
            left = ++right
        // 大于3直接返回 
        }else {
            return str.substr(left,3)
        }
    }
    // 循环结果,若是大于3就返回,不然返回false
    return right - left + 1 >= 3 ? str.substr(left,3) : false
}
复制代码

相关知识点:

  • 计数器
  • 正则
  • 双指针(算法思惟) + 判断连续数字

59. 判断是否符合指定格式

题目描述
给定字符串 str,检查其是否符合以下格式
一、XXX-XXX-XXXX
二、其中 X 为 Number 类型
输入:'800-555-1212'
输出:true

// 方法一:正则
function matchesPattern(str) {
    return /^\d{3}-\d{3}-\d{4}$/.test(str)
}
复制代码

相关知识点:

  • 匹配或者判断什么格式就优先考虑正则

60. 判断是否符合 USD 格式

题目描述
给定字符串 str,检查其是否符合美圆书写格式
一、以 $ 开始
二、整数部分,从个位起,满 3 个数字用 , 分隔
三、若是为小数,则小数部分长度为 2
四、正确的格式如:$1,023,032.03 或者 $2.03
错误的格式如:$3,432,12.12 或者 $34,344.3
输入:'$20,933,209.93'
输出:true

// 方法一:正则,从左往右写,依次匹配
function isUSD(str) {
    return /^\$[\d]{1,3}(\,[\d]{3})*(|\.[\d]{2})$/.test(str)
}
复制代码

相关知识点:

  • 正则

已经到底拉,60道题完事,恭喜你,通关啦~~~~

相关文章
相关标签/搜索