不好意思,最近心情不太好,晚来更新了。
最近的题目都是来自GitHub,https://github.com/kennymkchan/interview-questions-in-javascript#array--intersection
有兴趣花点时间做做看,也是很大收获的。
题目:
给定一个字符串如”Welcome to this Javascript Guide!“,请变成如下形式"emocleW ot siht tpircsavaJ !ediuG"。
原答案,比较有意思,将整个字符串包含空格字符按字符分割再reverse,再将新字符串按空格字符分割再reverse,个人有点过于依赖原生API,不太直观的感觉。
我的答案
let test = 'Welcome to this Javascript Guide!'
function changeStr(str) {
let arr = [];
arr = str.split(' ');
let len = arr.length;
let temp = '';
for (let i = 0; i < len; i++) {
let length = arr[i].length;
for (let e = length - 1; e >= 0; e--) {
temp += arr[i][e]
}
arr[i] = temp;
temp = '';
}
return arr.join(' ');
}
console.log(changeStr(test))
题目
Given two strings, return true if they are anagrams of one another “Mary” is an anagram of “Army”
中文说不太清楚,直接贴出原题目。大概意思,给定两个字符串,如果这两个单词互为同字母异序词(如Army和Mary),就返回true,否则返回false。
我一开始写把所有随机排列的结果都算出来放进一个数组,然后arr.includes(str2)就行,细想一下好像没这个必要,只要将字符和字符出现次数统计出来一对比就行了,然后就用蠢蠢的老方法strObj(别吐槽这个函数名)
首先有大小写陷阱,
var firstWord = "Mary";
var secondWord = "Army";
let test1 = "MMary";
let test2 = "Armyy";
let test3 = "apple";
let test4 = "plape";
function strObj(str) {
let obj = {};
let len = str.length;
for (let i = 0; i < len; i++) {
obj[str[i]] ? obj[str[i]] ++ : obj[str[i]] = 1
}
return obj;
}
function isAnagram(str1, str2) {
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
let len = str1.length;
let obj1 = strObj(str1), obj2 = strObj(str2);
for (let e = 0; e < len; e++) {
if (obj1[str1[e]] !== obj2[str1[e]]) {
return false;
}
}
return true;
}
console.log(isAnagram(firstWord, secondWord));
console.log(isAnagram(test1, test2));
console.log(isAnagram(test3, test4));
看了一下原答案,作者真的机智,乱序那我都给他们固定次序不久行了吗?sort()又立大功了。枉我想的有点复杂。
var firstWord = "Mary";
var secondWord = "Army";
isAnagram(firstWord, secondWord); // true
function isAnagram(first, second) {
// For case insensitivity, change both words to lowercase.
var a = first.toLowerCase();
var b = second.toLowerCase();
// Sort the strings, and join the resulting array to a string. Compare the results
a = a.split("").sort().join("");
b = b.split("").sort().join("");
return a === b;
}
判断是否是2的n次幂
这道题没思路,直接看原答案的
function isPowerOfTwo(number) {
// `&` uses the bitwise n.
// In the case of number = 4; the expression would be identical to:
// `return (4 & 3 === 0)`
// In bitwise, 4 is 100, and 3 is 011. Using &, if two values at the same
// spot is 1, then result is 1, else 0. In this case, it would return 000,
// and thus, 4 satisfies are expression.
// In turn, if the expression is `return (5 & 4 === 0)`, it would be false
// since it returns 101 & 100 = 100 (NOT === 0)
return number & (number - 1) === 0;
}
// For zero-case:
function isPowerOfTwoZeroCase(number) {
return (number !== 0) && ((number & (number - 1)) === 0);
}
对于计算机基础,我还很多不懂,上面用了一个&运算(1 & 1 = 1,1 & 0 = 0,0 & 0 = 0)判断。