我试图为以下问题写一个解决方案:
编写程序以为给定输入提供以下输出
Eg 1: Input: a1b10
Output: abbbbbbbbbb
Eg: 2: Input: b3c6d15
Output: bbbccccccddddddddddddddd
The number varies from 1 to 99.
这是我想出的解决方案:
import java.util.Scanner;
public class kee {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String ip = sc.nextLine();
for(int i = 0; i < ip.length(); i += 2) {
if(Character.getNumericValue(ip.charAt(i + 2)) >= 1 && Character.getNumericValue(ip.charAt(i + 2)) <= 9) {
for(int j = 0; j < Character.getNumericValue(ip.charAt(i + 1) + ip.charAt(i + 2)); j++)
System.out.print(ip.charAt(i));
}
else {
for (int k = 0; k < Character.getNumericValue(ip.charAt(i + 1)); k++)
System.out.print(ip.charAt(i));
}
}
}
}
如何解决此逻辑?
答案 0 :(得分:0)
通过对每个循环进行两次迭代,您将遇到问题。
a1b10c2d9
第一个循环:在a比较1,b 第二个循环:在b处比较1,0 第三循环:0,比较c,2 第四个循环:在2,比较d,9
由于您不知道输入的数字是两位还是一位,因此可能会比较错误的数据。对于第三个循环,i + 1实际上是罗马字符,而不是整数,因此您将循环遍历k。相反,我会尝试这样做:
String currentCharacter = "";
String currentIterator = "";
boolean found = false;
for(int x = 0; x < ip.length(); x++){
if(Character.getNumericValue(ip.charAt(x)) > 9 && !found){
currentCharacter = String.valueOf(ip.charAt(x));
found = true;
}else if(Character.getNumericValue(ip.charAt(x)) <= 9){
currentIterator += String.valueOf(ip.charAt(x));
}else if(Character.getNumericValue(ip.charAt(x)) > 9 || x == ip.length - 1){
for(int k = 0; k < Integer.parseInt(currentIterator); k++){
System.out.println(currentCharacter);
}
System.out.println();
currentCharacter = String.valueOf(ip.charAt(x));
currentIterator = "";
}
}
遵循这些原则可能会更好。我不是自己编译的,所以希望没有语法错误。对于您的代码,您还可以确定要比较的值是整数还是字母,然后根据需要将其适当地添加到迭代器中。
答案 1 :(得分:0)
我已经通过使用正则表达式每次提取字符部分和计数器部分来解决它。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Ff {
static Pattern part=Pattern.compile("(([a-z])([0-9]+)).*");
public static void parseCommand(String in) {
while (in.length()>0)
{
Matcher m=part.matcher(in);
if(m.matches())
{
String chars=m.group(2);
String count=m.group(3);
for(int i=1;i<=Integer.parseInt(count);i++)
System.out.print(chars);
in=in.substring(m.group(1).length());
} else {
System.out.println("\nremaining part: in");
break;
}
}
System.out.println();
}
public static void main(String args[]) {
parseCommand("a1b10");
parseCommand("b3c6d15");
}
}
第1组用于子字符串
答案 2 :(得分:0)
import java.util.Scanner;
public class Example {
public final static String lowerAlphabet = "abcdefghjklmonpqrstuvwxyz",
upperAlphabet = lowerAlphabet.toUpperCase(),
alphabet = lowerAlphabet + upperAlphabet;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String ip = sc.nextLine();
int i = 0;
while (i < ip.length()) {
int nextLetter = indexOfNextLetter(i + 1, ip); //Step 1
for (int j = 0; j < Integer.parseInt(ip.substring(i + 1, nextLetter)); j++) //Step 2
System.out.print(ip.charAt(i)); //Step 3
i = nextLetter; //Step 4
}
sc.close();
}
public static int indexOfNextLetter(int startIndex, String s) {
if (startIndex >= s.length())
return s.length();
else if (alphabet.contains("" + s.charAt(startIndex)))
return startIndex;
else
return indexOfNextLetter(startIndex + 1, s);
}
}
我通过使用字母的方法和字符串找到字符的下一个索引来解决了这个问题。
方法 indexOfNextLetter 返回下一个字母的索引或字符串的长度。这样一来,我们的程序就可以使用任何整数,而不仅仅是0-99。
步骤1:检索下一个字母的索引。
第2步:程序执行的循环与以前相同,但我使用了
Integer.parseInt()
找出子字符串的值
在第一个字母和下一个字母之间。
步骤3:然后循环打印第一个字母,直到到达为止 子串的值就像以前一样。
步骤4:然后将i设置为下一个字母的索引。
这就是我要这样做的方式,但是我敢肯定还有更高效,更短的方法!