[英]Move string capital letters to front while maintaining the order (JavaScript)
这是我的第一篇文章,所以我希望我能正确地做到这一点。
我正在使用编码 class,我们被要求制作一段代码,要求输入一个短语,并在控制台中返回该短语,并将大写字母移到前面,但顺序仍然相同。 然后将这个重新排序的短语打印到控制台。 (我们不允许使用数组)例如:输入"HeLLoTherE"
将返回"HLLTEeoher"
然而,问题是我在理解如何编写这段代码时遇到了问题。 我怎样才能使代码 select 这些大写字母移动到前面呢? 使用.toUpperCase()? 我怎样才能使 select 成为字母并将其移动到 rest 的前面? 如果有人可以向我展示如何完成此操作的示例并稍微解释一下,我将不胜感激:)
好吧,你不能使用 arrays,这有点困难,但是你仍然可以做一些事情。
虽然我使用的是 for 循环,但我实际上并没有使用 arrays。由于字符串允许使用[]
运算符,因此您可以使用索引 select 字符串的每个字符并检查它是小写还是大写。
另外,你说你需要保持大写字母的顺序,所以你不能只做newStr = upper + newStr
,因为它会恢复原来的顺序。 因此,我使用string.prototype.substring()
将大写字符插入到应该插入的位置。
const str = "HeLLoTherE"; const moveUpperToFront = (target) => { // Strings are immutable in js, so you cannot move one character // to the front without using a new string. let newStr = ""; // Number of uppercase letters that appeared. // It's necessary because you need to mantain the original order let upperNumber = 0; // Iterate each character from beginning for (let i = 0; i < str.length; ++i) { // Is there an uppercase letter? if (str[i].charCodeAt() >= 65 && str[i].charCodeAt() <= 90) { newStr = newStr.substring(0, upperNumber) + str[i] + newStr.substring(upperNumber, newStr.length); ++upperNumber; } // No uppercase letter? else newStr += str[i]; } return newStr; }; console.log(moveUpperToFront(str));
您可能只是从最直接的算法开始,以使某些东西起作用。
let value = "HeLLoTherE"; let result = ""; for (let char of value) { if (char >= "A" && char <= "Z") { result += char; } } for (let char of value) { if (char >= "a" && char <= "z") { result += char; } } console.log(result);
然后,您可以通过组合条件来合并 2 个循环。
let value = "HeLLoTherE"; let upper = ""; let lower = ""; for (let char of value) { if (char >= "A" && char <= "Z") { upper += char; } else if (char >= "a" && char <= "z") { lower += char; } } console.log(upper + lower);
解决这个问题的另一种方法是使用正则表达式。
var value = "HeLLoTherE"; var upper = value.replace(/[^AZ]*/g, ""); var lower = value.replace(/[^az]*/g, ""); console.log(upper + lower);
这个答案试图在不使用“数组”的情况下实现预期的目标。 它确实使用反引号,但如果需要,可以用简单的字符串连接代替。
代码片段
// move upper-case letters while // keeping relative order same const capsWithOrder = str => { // initialize result variables let capsOnly = "", restAll = ""; // iterate over the given string input for (let i = 0; i < str.length; i++) { // if character at index "i" is upper-case // then, concatenate character to "capsOnly" // else, concatenate to "restAll" if (str[i] === str[i].toUpperCase()) capsOnly += str[i]; else restAll += str[i]; }; // after iterating over all characters in string-input // return capsOnly concatenated with restAll return `${capsOnly}${restAll}`; }; console.log(capsWithOrder("HeLLoTherE"));
解释
在上面的代码片段中添加了内联评论。
遵循使用for...of
循环迭代输入的解决方案。 它将输入拆分为大写和小写文字,然后合并回去:
const exampleLiteral = 'HeLLoTherE';
const isUppercase = (literal) => literal === literal.toUpperCase() && literal !== literal.toLowerCase();
const prefixCapitalLetters = (literal) => {
let capitalLetters = '';
let lowerLetters = '';
for (let letter of literal) {
if(isUppercase(letter)) {
capitalLetters = capitalLetters.concat(letter);
continue;
}
lowerLetters = lowerLetters.concat(letter);
};
return capitalLetters+lowerLetters;
}
console.log(prefixCapitalLetters(exampleLiteral));
这真的不是一个很难的问题:
function rearrange(str) { let result = ""; for (let c of str) if (c >= 'A' && c <= 'Z') result += c; for (let c of str) if (c < 'A' || c > 'Z') result += c; return result; } console.log(rearrange("Hello World, It Is A Beautiful Morning;"));
查找大写字符,并将它们添加到结果字符串中。 然后go回去找其他的字符,在最后加上。 通过在没有任何排序的情况下循环,只是从开始到结束的简单迭代,顺序被保留(除了大写的东西)。
真正困难的部分是想出一种方法来检测所有 Unicode 中的“大写”字母。某些语言(好吧,正字法)根本没有这个概念。 JavaScript 有越来越多和不太方便的方法来处理这个问题,但我怀疑 OP 到目前为止可用的课堂材料,考虑到原始问题的性质,这种正则表达式技巧可能不适合作为答案。
像这样的东西
const string1 = 'HeLLoTherE' const transform = string => { const lower = string.split('').filter(c => c.charCodeAt() > 'a'.charCodeAt()) const upper = string.split('').filter(c => c.charCodeAt() < 'Z'.charCodeAt()) return [...upper, ...lower].join('') } console.log(transform(string1))
我认为那一定是工作。
const sort = [
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''),
'abcdefghijklmnopqrstuvwxyz'.split('')
]
function listByValue(string) {
string = [...string];
let ret = [];
for (let i in sort)
ret = [...ret,...string.filter(e=>sort[i].includes(e))];
return ret.join('')
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.