【问题标题】:Insert Spaces into string at an index在索引处将空格插入字符串
【发布时间】:2020-05-16 19:01:37
【问题描述】:
我正在尝试解决这个 Codewars 问题。
任务
在这个简单的 Kata 中,您的任务是创建一个将字符串转换为墨西哥波浪的函数。您将收到一个字符串,您必须在一个数组中返回该字符串,其中一个大写字母是一个站着的人。
规则
- 输入字符串始终为小写,但可能为空。
- 如果字符串中的字符是空格,则将其作为空位传递。
例子
wave("hello") => ["Hello", "hEllo", "heLlo", "helLo", "hellO"]
My code so far is hosted on this repl.it
我的思考过程如下:
- 把参数变成数组
- 在 index 处操作数组的每个索引,然后重新调整前一个索引以形成波形
- 将数组转成字符串
- 在将其记录到控制台并重新启动循环之前重新插入空格
我很困惑,我的思绪被困在如何使用上
for(var j = 0; j < indexSpaceNumber.length; j++){
//join and add in the spaces at their former index before returning string
strToArray[indexSpaceNumber[j]].slice(0, " ");
}
在字符串中插入空格。
如果有任何指导或提示,将不胜感激。我觉得我很近,但又如此令人沮丧。
【问题讨论】:
标签:
javascript
arrays
string
split
slice
【解决方案1】:
主要思想是:
- 迭代字符
- 将原始字符串中的字符替换为大写版本
您可以使用Array.from() 将字符串转换为数组,并将每个项目映射到一个新字符串。如果字符是空格,则返回错误的内容(示例中为空字符串)。创建数组后,过滤所有假值:
const wave = str =>
Array.from(str, (c,i) => // convert the string to an array
// replace the character with an uppercase version in the original string
c === ' ' ?
''
:
`${str.substring(0, i)}${c.toUpperCase()}${str.substring(i + 1)}`
).filter(c => c)
const result = wave("hello")
console.log(result)
【解决方案2】:
对于带空格的字符串
function wave(str) {
let res = []
str.toLowerCase().split('').forEach((v, i) => {
if(v == ' ') return;
res.push( str.substr(0, i) + v.toUpperCase() + str.substr(i + 1) )
});
return res
}
console.log(wave("hello hello"))
【解决方案3】:
我会递归;)
您知道对于长度为 n 的字符串,您需要一个相同长度的数组。这就是你的退出条件。
您可以在每次迭代时使用数组的长度来计算下一个字符串的形状:
hello [] [Hello] 0: uppercase 1st char and append
hello [Hello] [Hello hEllo] 1: uppercase 2nd char and append
hello [Hello hEllo] [Hello hEllo heLlo] 2: uppercase 3rd char and append
...
const wave =
(str, arr = []) =>
str.length === arr.length
? arr
: wave
( str
, [ ...arr
, str.slice(0, arr.length)
+ str[arr.length].toUpperCase()
+ str.slice(arr.length + 1)
]
);
console.log(wave('hello'));
【解决方案4】:
遍历字符串中的每个字符并构建
Slice str from start till current char + current char to upper case + Slice str from current char to end
const wave = str => {
const res = [];
for (let i = 0; i < str.length; i++) {
res.push(`${str.slice(0, i)}${str[i].toUpperCase()}${str.slice(i + 1)}}`);
}
return res;
};
console.log(wave("hi my name is rylan"));
// Alternate way to do with Array.splice
const wave2 = str => {
const res = [];
for (let i in str) {
const temp = Array.from(str);
temp.splice(i, 1, temp[i].toUpperCase());
res.push(temp)
}
return res.map(x => x.join(''));
};
console.log(wave2("hi my name is rylan"));