只减少字母

时间:2016-04-03 00:25:36

标签: java char ascii

我必须处理一些字符串,我应该将它们放在 N 位置左边以组织字符串。

这是我的代码:

private String toLeft() {
    String word = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Example
    byte lpad = 2; // Example
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < word.length(); i++) {
        sb.append((char) (word.charAt(i) - lpad));
    }
    return sb.toString();
}

它为那些不必多次移动的输入工作......

所以,问题在于,当要移动的位置的数量N有点大(如10)时,它会返回非字母,如下例所示,我该怎么做才能防止它?

例如:ABCDEFGHIJKLMNOPQRSTUVWXYZ如果我将每个字符10位置向左移动,则返回789:;<=>?@ABCDEFGHIJKLMNOP,而必须返回QRSTUVWXYZABCDEFGHIJKLMNOP

一些输入及其预期输出:

  • VQREQFGT // 2 positions to left == TOPCODER
  • ABCDEFGHIJKLMNOPQRSTUVWXYZ // 10 positions to left == QRSTUVWXYZABCDEFGHIJKLMNOP
  • LIPPSASVPH // 4 positions to left == HELLOWORLD

3 个答案:

答案 0 :(得分:3)

我认为你误解了你的(家庭作业?)要求你要做什么。让我们看看你的例子:

  

VQREQFGT //左侧2个位置== TOPCODER

有道理。输出中的每个字符在相应输入之前是两个字符。但请继续阅读...

  

ABCDEFGHIJKLMNOPQRSTUVWXYZ //左侧10个位置== QRSTUVWXYZABCDEFGHIJKLMNOP

毫无意义(从字面上看)。字母Q不是字母表中A之前的10个字符。字母表中的字母A之前没有字母。

好的,您如何通过10个步骤从AQ

回答......你好好回答!

AZYXWVUTSRQ ... 10个步骤:计算它们。

所以要求实际要求的是左边的带有环绕的N个字符。即使他们没有明确说明,这是例子“工作”的唯一方式。

但是你刚刚在左边的中实现了N个字符而没有环绕。你需要实现环绕。 (我不会告诉你如何,但有很多方法可以做到。)

还有另外一件事。问题的标题是“只减少字母”......这对我来说意味着你的要求是说不是字母的字符不应该减少。但是,在您的代码中,您将减少输入中的每个字符,无论它是否为字母。 (修复很简单......你应该自己解决。)

答案 1 :(得分:1)

  

我该怎么做才能阻止它?

你把它包起来。
如果你想要一个值从10到19然后再从10开始,在每次迭代中你减去10,增加1,取其余的除以20,然后再加10。

只有在这里,10是'A',19是Z,而不是增加1,我们添加或减去n。

private String toLeft() {
    String word = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Example
    byte lpad = 10; // Example
    StringBuilder sb = new StringBuilder();
    int n = -lpad;                  // I'm using n here to I can use '+ n' below
    for (int i = 0; i < word.length(); i++) {
        int shifted = word.charAt(i) - 'A' + n;
        shifted %= ('Z' - 'A' + 1); // This is for positive n
        while(shifted < 0)          // And this for negative ones
        {
            shifted += ('Z' - 'A' + 1);
        }
        sb.append((char)(shifted + 'A'));
    }
    return sb.toString();
}

答案 2 :(得分:0)

请阅读@StephenC's excellent answer有关环绕的内容。简而言之,您不会向左移动 ,向左移动 ,这样BAZ→{{ 1}}。旋转时,将环绕到另一端。

因此,对于希望Y - A轮换的字母。最简单的旋转方法是使用模数(Z)。

您的逻辑如下:

  1. 将字母% - A转换为数字Z - 025
  2. 应用移位并环绕。由于你向左移动,你从数字中减去,所以为了防止负数,你可以从向右移动整个周期开始:n = ch - 'A'
  3. 将数字转换回字母:n = (n + 26 - shift) % 26
  4. 以下是代码:

    ch = (char)(n + 'A')

    当然,您应该验证输入并测试您的代码:

    private static String rotateLeft(String text, int count) {
        char[] buf = text.toCharArray();
        for (int i = 0; i < buf.length; i++)
            buf[i] = (char)((buf[i] - 'A' + 26 - count) % 26 + 'A');
        return new String(buf);
    }
    

    <强>输出

    private static String rotateLeft(String text, int count) {
        char[] buf = text.toCharArray();
        if (count <= 0 || count >= 26)
            throw new IllegalArgumentException("Invalid count: " + count);
        for (char ch : buf)
            if (ch < 'A' || ch > 'Z')
                throw new IllegalArgumentException("Invalid character: " + ch);
        for (int i = 0; i < buf.length; i++)
            buf[i] = (char)((buf[i] - 'A' + 26 - count) % 26 + 'A');
        return new String(buf);
    }
    
    public static void main(String[] args) {
        System.out.println(rotateLeft("VQREQFGT", 2));
        System.out.println(rotateLeft("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10));
        System.out.println(rotateLeft("LIPPSASVPH", 4));
    }