題目列表
第一題:數字轉換爲字符串
題目
sumStrings(‘1’,‘2’) // => ‘3’
注意的地方在於大數字的計算會被轉換爲科學計數法,並且會省略一部分數字,所以把科學計數法轉換爲正常十進制的結果不對
這裏可以看出 toString 和 toLocalString兩個方法的區別
我們需要的是:712577413488402631964821329
toString() : 7.125774134884027e+26
toLocalString() : 712,577,413,488,403,000,000,000,000
代碼
// 沒有解決,採用取巧的辦法提交,去查看答案區的方法
//代碼區方案
// 一、利用數組,逐個計算
function sumStrings(a,b) {
var res="",c=0;
a=a.split("");b=b.split("");
while(a.length||b.length||c){
c=+(a.length>0?a.pop():0) + +(b.length>0?b.pop():0)+c;
res=(c%10).toString()+res;
c=Math.floor(c/10);
}
res=res.replace(/^[0]*/g,"");
return res;
}
第二題:字符串正則轉換
題目
有多個相同的字符,轉換爲 ‘)’,單個字符轉換爲 ‘(’
Examples
“din” => “(((”
“recede” => “()()()”
“Success” => “)())())”
“(( @” => “))((”
代碼
// 原始思路
// 注意點:
// new RegExp 可使用變量
// /[^A-z]/.test(item) && ('\\'+item) 判斷並添加轉義字符
function duplicateEncode(word){
// ...
let reW = word.length - word.replace(/\)/g,'').length > 1 ? word : word.replace(')','(')
word.split('').forEach(item=>{
if(item == ')') return;
var rep = new RegExp(/[^A-z]/.test(item) && ('\\'+item) || item,'gi')
reW = reW.length - word.replace(rep,'').length > 1 ? reW.replace(item,')') : reW.replace(item,'(')
})
return reW
}
// 代碼區
// 一、比較某個元素初次出現的位置和最後出現的位置是否相同
function duplicateEncode(word){
return word
.toLowerCase()
.split('')
.map( function (a, i, w) {
return w.indexOf(a) == w.lastIndexOf(a) ? '(' : ')'
})
.join('');
}
// 二、查詢是否有同樣的元素出現在不同的位置
function duplicateEncode(word) {
var letters = word.toLowerCase().split('')
return letters.map(function(c, i) {
return letters.some(function(x, j) { return x === c && i !== j }) ? ')' : '('
}).join('')
}
第三題:查詢數組最大值和最小值
題目
Example:
highAndLow(“1 2 3 4 5”); // return “5 1”
highAndLow(“1 2 -3 4 5”); // return “5 -3”
highAndLow(“1 9 3 4 -5”); // return “9 -5”
代碼
// 原始思路,這個麻煩了,看代碼區代碼
function highAndLow(numbers){
// ...
return numbers.split(' ').reduce((a,b)=>Math.max(a,b)) + ' ' + numbers.split(' ').reduce((a,b)=>Math.min(a,b))
}
// 代碼區代碼
function highAndLow(numbers){
numbers = numbers.split(' ');
return `${Math.max(...numbers)} ${Math.min(...numbers)}`;
}
第四題:字符串去重並排序
題目
a = “xyaabbbccccdefww”
b = “xxxxyyyyabklmopq”
longest(a, b) -> “abcdefklmopqwxy”
代碼
function longest(s1, s2) {
// your code
return (s1+s2).split('').sort().filter((item,index,arr) => item !== arr[index-1]).join('')
}
// 答案區代碼
// 利用 Set 結構去重
const longest = (s1, s2) => [...new Set(s1+s2)].sort().join('')
// or
function longest(s1, s2) {
return Array.from(new Set(s1 + s2)).sort().join('');
}
第五題:計算Unicode編碼
題目
代碼
// 原始思路
function findMissingLetter(array)
{
return String.fromCharCode(array.filter((a,i,arr)=>(arr[i+1] || a).charCodeAt(0) - a.charCodeAt(0) == 2)[0].charCodeAt(0)+1)
}
// 代碼區
// 方法一
function findMissingLetter(array) {
let first = array[0].charCodeAt(0)
for (let i = 1; i < array.length; i++) {
if (first + i !== array[i].charCodeAt(0)) {
return String.fromCharCode(first + i)
}
}
throw new Error("Invalid input")
}
//方法二
function findMissingLetter(array)
{
var i=array[0].charCodeAt();
array.map(x=> x.charCodeAt()==i?i++:i);
return String.fromCharCode(i);
}
第六題:數組去重與求和
題目
範圍內3和5的倍數的累加和
solution(10) => [3,5,6,9] => 23
代碼
// 原始代碼
function solution(number){
let i=0,arr = [];
while(3*i<number){
3*i<number && arr.push(3*i)
5*i<number && arr.push(5*i)
i++
}
return arr.length ? [...new Set(arr)].reduce((a,b)=>a+b) : 0
}
// 答案區
// 一、map過濾
function solution(number){
return number < 3 ? 0
: [...Array(number).keys()]
.map(int => (int % 3 === 0 || int % 5 === 0) ? int : 0 )
.reduce((a, b) => a + b )
}
// 二、for 循環累加
function solution(number){
var sum = 0;
for(var i = 1;i< number; i++){
if(i % 3 == 0 || i % 5 == 0){
sum += i
}
}
return sum;
}
第七題:數組過濾指定元素
題目
[‘n’, ‘s’, ‘w’, ‘e’]這樣一個數組,數組長度爲10
其中 n 的數量 等於 s 的數量
w 的數量 等於 e 的數量
isValidWalk([‘n’,‘s’,‘n’,‘s’,‘n’,‘s’,‘n’,‘s’,‘n’,‘s’]) => true
isValidWalk([‘n’,‘s’,‘n’,‘s’,‘n’,‘s’,‘n’,‘s’]) => fasle
代碼
// 原始思路
function isValidWalk(walk) {
const wfl = i => walk.filter(item => item==i).length;
return walk.length == 10
&& wfl('n') == wfl('s')
&& wfl('w') == wfl('e')
}
// 代碼區
// 一、好理解,值遍歷一次數組
function isValidWalk(walk) {
var dx = 0
var dy = 0
var dt = walk.length
for (var i = 0; i < walk.length; i++) {
switch (walk[i]) {
case 'n': dy--; break
case 's': dy++; break
case 'w': dx--; break
case 'e': dx++; break
}
}
return dt === 10 && dx === 0 && dy === 0
}
第八題:異或比較
題目
給定一個數組,找出出現奇數次的整數。
findOdd([20,1,1,2,2,3,3,5,5,4,20,4,5]) => 5
代碼
// 原始思路,缺點遍歷多次,耗時間
function findOdd(A) {
const afl = a => A.filter(item=>item!=a).length;
return A.filter(item=>afl(item)%2==0)[0];
}
// 答案區代碼
/**
這裏用到了異或操作,二進制比較
相同爲假,不同爲真,比較到最後只剩下一個,就是多餘的奇數
這個方法太棒了
異或方法原理示例
# [32] [16] [8] [4] [2] [1]
16 0 1 0 0 0 0
6 0 0 0 1 1 0
22 0 1 0 1 1 0
*/
const findOdd = (xs) => xs.reduce((a, b) => a ^ b);
第九題:選出數組最小值
題目
求出數組最小的兩個值的和,不考慮空值等情況
代碼
function sumTwoSmallestNumbers(numbers) {
//Code here
return numbers.sort((a,b)=>(a-b))[0] + numbers.sort((a,b)=>(a-b))[1]
}
第十題:對象名爲變量
題目
判斷對象是否存在,不存在則返回’There is no mnemonic for this.’
判斷屬性是否存在,不存在則返回"You’re onto something, but still quite far off."
對象屬性存在則返回屬性值
代碼
// 原始思路
function mnemonicLookup(group, word) {
// objects have been preloaded
return this[group]
? this[group][word]
? this[group][word]
: "You're onto something, but still quite far off."
: 'There is no mnemonic for this.'
}