前端刷題 —— 牛客網前端題庫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道題完事,恭喜你,通關啦~~~~

相關文章
相關標籤/搜索