介绍

接着上次的中级算法题


目录


1. Missing letters

Find the missing letter in the passed letter range and return it.

If all letters are present in the range, return undefined.

Here are some helpful links:

  • String.prototype.charCodeAt()
  • String.fromCharCode()

charCodeAt()方法返回一个字符的UTF-16

fromCharCode()方法返回给定参数对应的字符串,如有多个参数,就用,隔开。

思路

  • 对比相邻的两字符,判断他们的UTF-16差值是否等于1.

  • 不等于1时,使用fromCarCode()方法返回较小值+1对应的字符串。

function fearNotLetter(str) {
for (let i = 0, len = str.length; i < len - 1; i++) {
if (str.charCodeAt(i + 1) - str.charCodeAt(i) !== 1) {
return String.fromCharCode(str.charCodeAt(i) + 1);
}
}
return undefined;
}

2. Boo who

Check if a value is classified as a boolean primitive. Return true or false.

Boolean primitives are true and false.

Here are some helpful links:

  • Boolean Objects

方法 1

直接用typeof即可

function booWho(bool) {
return typeof bool === 'boolean';
}

方法 2

Boolean函数返回一个值为true或false的值,可利用这个特性进行判断。

function booWho(bool) {
return bool === Boolean(bool);
}

3. Sorted Union

Write a function that takes two or more arrays and returns a new array of unique values in the order of the original provided arrays.

In other words, all values present from all arrays should be included in their original order, but with no duplicates in the final array.

The unique numbers should be sorted by their original order, but the final array should not be sorted in numerical order.

Check the assertion tests for examples.

Here are some helpful links:

  • Arguments object
  • Array.prototype.reduce()

此题考察字符串去重

思路

  • 利用reduce()方法和concat()方法进行数组的合并。

  • 利用filter()方法和indeof()方法进行去重。

function uniteUnique(arr) {
let arr1 = Array.prototype.slice.call(arguments); arr1 = arr1.reduce((array1, array2) => {
return array1.concat(array2);
}); return arr1.filter((val, index) => {
return arr1.indexOf(val) === index;
});
}

4. Convert HTML Entities

Convert the characters &, <, >, " (double quote), and ' (apostrophe), in a string to their corresponding HTML entities.

Here are some helpful links:

  • RegExp
  • HTML Entities
  • String.prototype.replace()

思路

  • 确定正则表达式,/[&<>"']/g。

  • 利用replace()方法和正则表达式替换掉对应的字符即可。

function convertHTML(str) {
return str.replace(/[&<>"']/g, (val) => {
return '&' + {
'&': 'amp',
'<': 'lt',
'>': 'gt',
'"': 'quot',
'\'': 'apos'
}[val] + ';';
});
}

5. Spinal Tap Case

Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.

Here are some helpful links:

  • RegExp
  • String.prototype.replace()

思路

  • 去掉'_',替换成' '(空格)。

  • 在所有大写字母前加入一个空白。

  • 如果开头有空白,把空白去掉。

  • 把大写字母前的一个或多个空白换为'-'。

  • 把大写字母都转为小写。

function spinalCase(str) {
return str.replace(/_/g, ' ').replace(/([A-Z])/g, ' $1').replace(/^\s/, '').replace(/\s+/g, '-').toLowerCase();
}

6. Sum All Odd Fibonacci Numbers

Given a positive integer num, return the sum of all odd Fibonacci numbers that are less than or equal to num.

The first two numbers in the Fibonacci sequence are 1 and 1. Every additional number in the sequence is the sum of the two previous numbers. The first six numbers of the Fibonacci sequence are 1, 1, 2, 3, 5 and 8.

For example, sumFibs(10) should return 10 because all odd Fibonacci numbers less than 10 are 1, 1, 3, and 5.

Here are some helpful links:

  • Remainder

菲波那切数列,从第三位起,每一位数都是前两位数之和。此题求的是和,因此没必要存储数字,直接判断后相加即可。

思路

  • 判断当前的菲波那切数是否为奇数,如果是,则加上

  • 利用ES6的新语法解构赋值,进行简单的数值交换。

function sumFibs(num) {
let a = 1;
let b = 1;
let sum = 0; while (a <= num) {
sum += a % 2 !== 0 ? a : 0;
[a, b] = [b, a + b];
} return sum;
}

7. Sum All Primes

Sum all the prime numbers up to and including the provided number.

A prime number is defined as a number greater than one and having only two divisors, one and itself. For example, 2 is a prime number because it's only divisible by one and two.

The provided number may not be a prime.

Here are some helpful links:

  • For Loops
  • Array.prototype.push()

质数,只能被1和其自身整除。利用各种质数筛选法筛选好质数后相加即可得到答案。

思路

  • 利用某种质数筛选法筛选出质数,并添加到数组里。

  • 利用reduce()方法相加

方法 1

利用除法直接判断。但这种算法重复率高,效率低。

function sumPrimes(num) {
if (num < 2) {
return 0;
}
let arr = [2];
let isPrime = 3; while (isPrime <= num) {
// 判断是否是质数
for (let i = 0, len = arr.length; i < len; i++) {
if (isPrime % arr[i] === 0) {
break;
}
if (Math.pow(arr[i], 2) > isPrime) {
arr.push(isPrime);
break;
}
}
isPrime++;
} return arr.reduce((sum, val) => {
return sum + val;
});
}

方法 2

利用埃拉托斯特里筛法进行筛选。

ceil()方法对一个浮点数向上取整。

function sumPrimes(num) {
let arr = []; for (let i = 0; i <= num; i++) {
arr.push(i);
} for (let i = 2, len = Math.ceil(Math.sqrt(num)); i < len; i++) {
if (!!arr[i]) {
for (let j = i * 2; j <= num; j += i) {
arr[j] = undefined;
}
}
}
arr.splice(0, 2); return arr.filter((val) => {
return !!val;
}).reduce((sum, val) => {
return sum + val;
}, 0);
}

本文也发表在了简书上。

最新文章

  1. 网页播放器(jsp、js)
  2. C++重载覆盖隐藏
  3. 【工作备忘】suricata
  4. fil_space_t
  5. Delphi 让自己的软件实现双击打开文件 转
  6. delphi 在 DragDrop 的时候,滚动 TreeView
  7. DOM事件逐层上机传递
  8. POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)
  9. iOS加载HTML, CSS代码
  10. javaWeb学习总结(8)- jsp指令(3)
  11. PHP初入,基础知识点分享(a标签&amp;表格的嵌套&amp;文字的处理)
  12. 【SSH框架】之Struts2系列(二)
  13. python模块 - 常用模块推荐
  14. 浅谈Web开发中的定时任务
  15. SVM-sklearn
  16. IoU
  17. C++ 二维数组作为形参传递使用实例
  18. 小程序setData修改数组某一项的值
  19. 2017-08-20 block,inline和inline-block概念和区别
  20. 译:微软发布.NET应用架构指南草案

热门文章

  1. Kattis - bela
  2. React高级指南
  3. JQuery获取ID含有特殊字符的DOM元素
  4. 2019-03-28 SQL Server Table
  5. java EE使用response返回中文时,出现乱码问题
  6. Unity WWW类调用http
  7. Ajax兼容性问题
  8. 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
  9. jQuery调用WebService ( 同源调用)
  10. lucene构建restful风格的简单搜索引擎服务