繁体   English   中英

在保持顺序的同时将字符串大写字母移到前面(JavaScript)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM