每日JavaScript - 4

本文探讨了两道有趣的JavaScript编程题目:一是字符串反转挑战,要求将给定字符串按字符反转;二是同字母异序词验证,检查两个字符串是否由相同字母组成。通过实际代码示例,展示了不同的解决策略,包括使用数组操作和字符计数方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不好意思,最近心情不太好,晚来更新了。
最近的题目都是来自GitHubhttps://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)判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值