我已经解决了这个问题数着笑脸
给定数组(arr)作为参数,完成函数countSmileys,该函数应该返回笑脸总数。 笑脸规则:
:或;-或~。)或D。除提及的字符外,不允许添加其他字符。
有效笑脸示例: :) :D ;-D :~) 无效笑脸: ;( :> :} :]
示例
countSmileys(‘:),’';(',';}',':-D');//应该返回2;countSmileys(';D',‘:(’,‘:)’;~‘);//应该返回3;countSmileys(';',*’,':$',‘’;//应该返回1;
Note
如果出现空数组,则返回0。您将不会使用无效的输入进行测试(输入总是一个数组)。面部的顺序(眼睛,鼻子,嘴巴)元素总是一样的。
然后,当我查看解决方案时,我发现很多人使用regexp。然后编写一个状态机来实现regexp并解决这个问题。但我失败了。这是我的密码:
function countSmileys(smileys) {
let state = smileyHasValidEye;
return smileys.filter(smiley => {
for (let s of [...smiley]) {
state = state(s);
}
return state === true;
}).length;
}
function smileyHasValidEye(s) {
if (s === ':' || s === ';') {
return smileyHasValidNose;
}
return smileyHasValidEye;
}
function smileyHasValidNose(s) {
if (s === '-' || s === '~') {
return smileyHasValidMouth;
}
return smileyHasValidMouth(s);
}
function smileyHasValidMouth(s) {
if (s === ')' || s === 'D') {
return true;
}
return;
}
console.log(countSmileys([':)', ';(', ';}', ':-D']));
我得到的错误是:
state = state(s);
^
TypeError: state is not a function然后我调试了我的代码,我发现这个过程没有输入smileyHasValidNose函数。那我不知道原因。
发布于 2021-10-29 15:14:04
问题是,在微笑之间,您并没有真正地重置state。因此,下一个笑脸状态将是true,您不能调用它(它不是一个函数)。
您可以为state使用一个局部变量,将其重置为第一个函数(第一步)。
function countSmileys(smileys) {
let firstStep = smileyHasValidEye;
return smileys.filter(smiley => {
let state = firstStep;
for (let s of [...smiley]) {
state = state(s);
}
return state === true;
}).length;
}
function smileyHasValidEye(s) {
if (s === ':' || s === ';') {
return smileyHasValidNose;
}
return smileyHasValidEye;
}
function smileyHasValidNose(s) {
if (s === '-' || s === '~') {
return smileyHasValidMouth;
}
return smileyHasValidMouth(s);
}
function smileyHasValidMouth(s) {
if (s === ')' || s === 'D') {
return true;
}
return;
}
console.log(countSmileys([':)', ';(', ';}', ':-D']));
但是,如果字符串中除了笑脸(或笑笑的一部分)之外还有更多的字符串,则此代码将出错。
如果没有检测到笑脸,我会将smileyHasValidMouth更改为返回false。只是为了在这里更加一致..。
function smileyHasValidMouth(s) {
if (s === ')' || s === 'D') {
return true;
}
return false;
}如果找到一个非函数的值,则调整循环以提前退出。
for (let s of [...smiley]) {
state = state(s);
if(typeof state !== 'function') return state;
}
function countSmileys(smileys) {
let firstStep = smileyHasValidEye;
return smileys.filter(smiley => {
let state = firstStep;
for (let s of [...smiley]) {
state = state(s);
if (typeof state !== 'function') return state;
}
}).length;
}
function smileyHasValidEye(s) {
if (s === ':' || s === ';') {
return smileyHasValidNose;
}
return smileyHasValidEye;
}
function smileyHasValidNose(s) {
if (s === '-' || s === '~') {
return smileyHasValidMouth;
}
return smileyHasValidMouth(s);
}
function smileyHasValidMouth(s) {
if (s === ')' || s === 'D') {
return true;
}
return false;
}
console.log(countSmileys([':~(', ':>', ':D', ':(', ':o>', ';)', ':)']));
https://stackoverflow.com/questions/69770950
复制相似问题