我必须处理一些字符串,我应该将它们放在 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
答案 0 :(得分:3)
我认为你误解了你的(家庭作业?)要求你要做什么。让我们看看你的例子:
VQREQFGT //左侧2个位置== TOPCODER
有道理。输出中的每个字符在相应输入之前是两个字符。但请继续阅读...
ABCDEFGHIJKLMNOPQRSTUVWXYZ //左侧10个位置== QRSTUVWXYZABCDEFGHIJKLMNOP
毫无意义(从字面上看)。字母Q
不是字母表中A
之前的10个字符。字母表中的字母A
之前没有字母。
好的,您如何通过10个步骤从A
到Q
?
回答......你好好回答!
A
,Z
,Y
,X
,W
,V
,U
,T
,S
,R
,Q
... 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有关环绕的内容。简而言之,您不会向左移动 ,向左移动 ,这样B
→A
→Z
→{{ 1}}。旋转时,将环绕到另一端。
因此,对于希望Y
- A
轮换的字母。最简单的旋转方法是使用模数(Z
)。
您的逻辑如下:
%
- A
转换为数字Z
- 0
:25
n = ch - 'A'
n = (n + 26 - shift) % 26
以下是代码:
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));
}