我需要创建一个函数alphabetIndexer,它将一个字符串作为参数,并返回一个数字字符串,表示每个字母在字母表中的位置(' a'是1,' z&# 39;是26)。如果字符为大写,则将其位置乘以2.应忽略字符串中非字母的所有字符。
function alphabetIndexer(str){
let alphabet = 'abcdefghigklmnopqrstuvwxyz';
let arr = [];
for(let i = 0; i < str.length; i++){
if(alphabet.includes(str[i].toLowerCase())){
if(str[i] === str[i].toUpperCase()){
arr.push(alphabet.indexOf((str[i] +1)*2))
} else {
arr.push(alphabet.indexOf(str[i]) +1);
}
}
}
return arr.join(' ');
}
我无法将UpperCase字母位置乘以2;
在测试案例&#34; Hello World&#34;它应该返回&#34; 16 5 12 12 15 46 15 17 12 4&#34; 但我的函数返回[-1,5,12,12,15,-1,15,18,12,4]
答案 0 :(得分:5)
你已经有了一个好的开始,你的错误已经让你的括号错了。这样:
arr.push(alphabet.indexOf((str[i] +1)*2))
应该是
arr.push((alphabet.indexOf(str[i]) +1)*2)
如果符合以下条件会更清楚:
str[i]
放入变量中,而不是每次都查找: - )
即:
arr.push((alphabet.indexOf(ch) + 1) * 2)
第二个问题是,您在执行toLowerCase
检查时只执行includes
事项,而在执行indexOf
时不会执行alphabet
事。您需要在查看function alphabetIndexer(str) {
let alphabet = 'abcdefghigklmnopqrstuvwxyz';
let arr = [];
for (let i = 0; i < str.length; i++) {
if (alphabet.includes(str[i].toLowerCase())) {
if (str[i] === str[i].toUpperCase()) {
arr.push((alphabet.indexOf(str[i].toLowerCase()) + 1) * 2); // ***
} else {
arr.push(alphabet.indexOf(str[i].toLowerCase()) + 1); // ***
}
}
}
return arr.join(' ');
}
console.log(alphabetIndexer("Hi there"));
的所有三个位置执行此操作:
"use strict";
function alphabetIndexer(str) {
let alphabet = 'abcdefghigklmnopqrstuvwxyz';
let arr = [];
for (let ch of str) { // Strings are iterable
// Only search `alphabet` once
let index = alphabet.indexOf(ch.toLowerCase());
if (index !== -1) {
if (ch === ch.toUpperCase()) {
arr.push((index + 1) * 2);
} else {
arr.push(index + 1);
}
}
}
return arr.join(' ');
}
console.log(alphabetIndexer("Hi there"));
&#13;
对于它的价值,这里有一些小的改变(不改变你的整体方法):
const
&#13;
您也可以考虑将arr
用于&#34;变量&#34;你永远不会改变(有趣的是,那些代码中的所有内容;更改arr
的状态并不会改变变量extract = Model(model.input, [model.get_layer('dense_1').output, model.output])
features, labels = extract.predict(x_test)
labels = np.argmax(labels, axis=1)
的内容)。
答案 1 :(得分:0)
arr.push((alphabet.indexOf(str[i]) +1)*2);
这显然是错误的地方。你确定你的* 2应该在indexOf参数中吗?试试这个:
viewBox
编辑:考虑为什么它会给你-1,这也是一个好主意。我不太确定,因为我自己没有Java 脚本专家。
答案 2 :(得分:0)
您可以使用.charCodeAt()
获取ASCII值,然后从0减去偏移量。
const CAPS_OFFSET = 64;
const LOWER_OFFSET = 96;
const ALPHA_ONLY = /[a-zA-Z]/;
console.log( alphabetIndexer('Hello World') );
function alphabetIndexer(str) {
let arr = Array.from(str, letter=>{
if (!ALPHA_ONLY.test(letter)) return;
let ascii = letter.charCodeAt(0)
return ascii > LOWER_OFFSET ? ascii - LOWER_OFFSET : (ascii - CAPS_OFFSET)*2;
});
return arr.join(' ')
}