2

我需要编写一个类,该类从用户那里获取一串文本并反转大写以及 string。例如,如果我输入字符串Mary had a little lamb.
结果将是.BMAL ELTTIL A DAH YRAm

我知道您可以使用StringBuilder反转字符串本身,但我无法找到反转大写的方法。

提前感谢您的帮助和建议!

4

7 回答 7

3

交换单个字符大小写的简单方法:

char swapCase(char c)
{
    return Character.isUppercase(c) ? 
           Character.toLowerCase(c) : 
           Character.toUpperCase(c)
}

只需在您反转字符串时使用它,沿途交换外壳。

于 2013-11-07T15:45:41.860 回答
0

String要“反转”大写,您必须逐个字符地遍历, 并“翻转”它。没有内置的方法可以做到这一点(因为这不是现实生活中任何人都想做的事情:))。

因此,遍历字符串,一次获取每个字符串,使用and/orchar检查它,然后使用and/or翻转它。Character.isUpperCase()Character.isLowerCase()Character.toUpperCase()Character.toLowerCase()

于 2013-11-07T15:45:11.743 回答
0

我会这样做:

String str = "Aasdf";
StringBuilder sb = new StringBuilder();
for(char ch : str.toCharArray()) {
    if (Character.isLowerCase(ch)) {
        sb.append(Character.toUpperCase(ch));
    } else {
        sb.append(Character.toLowerCase(ch));
    }
}
sb.reverse();
于 2013-11-07T15:48:46.853 回答
0

使用 char 数组:

public static String reverseAndCapitalize(final String input) {
    final char[] charsInput = input.toCharArray();
    final char[] charsOutput = new char[charsInput.length];
    for (int i = 0; i < charsInput.length; i++) {
        final char c = charsInput[i];
        final char output = Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);
        charsOutput[charsInput.length - i - 1] = c;
    }
    return new String(charsOutput);
}
于 2013-11-07T15:49:23.553 回答
0

将此字符串复制到新数组并将新数组转换为大写。

然后检查匹配的案例。如果找到匹配项,只需将其转换为小写。

伪代码:

reverse(String s) {
    sArray=s.toCharArray();
    copy sArray to tempArray;
    reverse both array;
    tempArray.toUpperCase();
    for(i=0;i<sArray.length; i++) {
      if(tempArray[i]== sArray[i]) {
            sArray[i].toLowerCase();
      }
    }

此代码用于在不使用字符串生成器的情况下编写代码。

于 2013-11-07T15:49:34.347 回答
0

您可以使用字符的位信息来确定它是否为大写字母。或者您可以简单地使用 String 类方法 isUpperCase 或 isLowerCase。

所以你需要测试

if(string.charAt(i).isUpperCase) {
    string.charAt(i).toLowerCase
    simplyReverse(string.charAt(i))
}
else
    simplyReverse(string.charAt(i));
于 2013-11-07T15:46:03.010 回答
0

以下解决方案具有 O(log(n)) 时间复杂度和 O(n) 空间复杂度。

static void Main(string[] args)
        {
            string reverse = SpecialReverse("PleaseReverseThisString");
            Console.WriteLine(reverse);
        }


private static string SpecialReverse(string v)
        {
            char[] str = v.ToCharArray();
            
            if(v.Length >1)
            {
                int length = (int)v.Length / 2;

                for (int i = 0; i < length; i++)
                {
                    var left = i;
                    var right = v.Length - 1 - i;

                    if (Char.IsUpper(str[left]) && !Char.IsUpper(str[right]))
                    {
                        str[left] = char.ToLower(str[left]);
                        str[right] = char.ToUpper(str[right]);
                    }
                    else if (!Char.IsUpper(str[left]) && Char.IsUpper(str[right]))
                    {
                        str[left] = char.ToUpper(str[left]);
                        str[right] = char.ToLower(str[right]);
                    }

                    Swap(str, left, right);
                }
            }
            
            return string.Join(string.Empty,str);
        }

        private static void Swap(char[] str, int i, int j)
        {
            var temp = str[i];
            str[i] = str[j];
            str[j] = temp;
        }
于 2021-09-28T23:55:09.143 回答