簡體   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