私はこの解決しようとしている - https://www.e-olymp.com/en/problems/7549を私は(唯一の1/4を通過した)すべてのテストに合格することはできません。私は、これらの入力で自分のコードをテストしていた。別の原子は、プログラム
(AlC2)3Na4
3Al+6C+4Na
Gh(G2H3(H1A45)2)5(Bn6Mn3)5
450A+30Bn+10G+Gh+25H+15Mn
(Na1000)10Na02
10002Na
だから、それは動作しますが、それは動作しませんように見えます。どんなヒントも素晴らしいだろう。 Mは、その原子メイクアップを記述する分子の化学式:ここで
は問題そのものです。化学式は以下の文法に従う:
M:= G | M G
G:= S | S C
S:= A | '(' M ')'
C:= T | N E
E:= D | D E
T:= '2' | ... | '9'
N:= '1' | ... | '9'
D:= '0' | .. | '9'
A:= U | | U L L
U:= 'A' | .. | 'Z'
L:= 'a' | .. | 「Z」
カウントCは、それに先行するサブグループSのための乗数を表します。例えば、H 2 Oは2つのH(水素)原子と1つのO(酸素)原子を有し、(AlC 2)3 Na 4は3つのAl(アルミニウム)、6 C(炭素)および4 Na(ナトリウム)原子を含む。
入力
複数のテストケースが含まれています。各テストケースについて、有効な化学式を含む1行が表示されます。各行の長さは100文字以下です。
各行に対する出力
サンプル出力に示すように和の形で化学の原子分解である出力の1行が存在することになります。原子は辞書順にリストされ、1のカウントが暗示され、明示的に書かれていない。出力には空白がありません。正しい出力のすべてのカウントは、32ビット符号付き整数で表現できます。
そして、これは私のコード(それは可能性があります嫌に見えますが、とにかく)です:
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
//Gh(G2H3(H1A45)2)5(Bn6Mn3)5
public class Main {
static Scanner mIn;
static PrintWriter mOut;
public static void main(String[] args) {
mIn = new Scanner(System.in);
mOut = new PrintWriter(System.out);
String line = mIn.nextLine();
ArrayList<Atom> atoms = new ArrayList<>();
ArrayList<Integer> startBr = new ArrayList<>();
for (int i = 0; i < line.length(); i++) {
if (line.charAt(i) == '(') {
//starting
startBr.add(atoms.size());
} else if (line.charAt(i) == ')') {
//ending
int n = 1;
if (line.length() > i + 1 && isNum(line.charAt(i + 1))) {
n = line.charAt(i + 1) - '0';
i++;
while (line.length() > i + 1 && isNum(line.charAt(i + 1))) {
n *= 10;
n += line.charAt(i + 1) - '0';
i++;
}
}
for (int j = startBr.get(startBr.size() - 1); j < atoms.size(); j++) {
atoms.get(j).n *= n;
}
startBr.remove(startBr.size() - 1);
} else if (Character.isUpperCase(line.charAt(i))) {
Atom atom = new Atom();
atom.name = String.valueOf(line.charAt(i));
if (line.length() > i + 1 && isCont(line.charAt(i + 1))) {
atom.name += String.valueOf(line.charAt(i + 1));
i++;
if (line.length() > i + 1 && isNum(line.charAt(i + 1))) {
atom.n = line.charAt(i + 1) - '0';
i++;
while (line.length() > i + 1 && isNum(line.charAt(i + 1))) {
atom.n *= 10;
atom.n += line.charAt(i + 1) - '0';
i++;
}
}
}
if (line.length() > i + 1 && isNum(line.charAt(i + 1))) {
atom.n = Integer.parseInt(String.valueOf(line.charAt(i + 1)));
i++;
while (line.length() > i + 1 && isNum(line.charAt(i + 1))) {
atom.n *= 10;
atom.n += line.charAt(i + 1) - '0';
i++;
}
}
atoms.add(atom);
}
}
for (int i = 0; i < atoms.size(); i++) {
for (int j = i + 1; j < atoms.size(); j++) {
if (atoms.get(i).name.equals(atoms.get(j).name)) {
atoms.get(i).n += atoms.get(j).n;
atoms.get(j).n = -1;
}
}
}
for (int i = 0; i < atoms.size(); i++) {
if (atoms.get(i).n < 1) {
atoms.remove(i);
}
}
Collections.sort(atoms, ALPHABETICAL_ORDER);
for (int i = 0; i < atoms.size(); i++) {
p(atoms.get(i).toString());
if (i != atoms.size() - 1) {
p("+");
}
}
}
private static Comparator<Atom> ALPHABETICAL_ORDER = new Comparator<Atom>() {
public int compare(Atom atom1, Atom atom2) {
return atom1.name.compareTo(atom2.name);
}
};
private static boolean isCont(char c) {
return c >= 'a' && c <= 'z';
}
private static boolean isNum(char c) {
return c >= '0' && c <= '9';
}
private static void p(Object obj) {
mOut.print(obj);
mOut.flush();
}
private static class Atom {
public String name;
public int n = 1;
public String toString() {
if (n == 1) {
return name;
}
return n + name;
}
}
}
動作しない入力と出力の例を教えてください。 –
私は2つのテストを例として挙げていますが、どちらも機能します。 e-olympにはさまざまなテストがありますが、私はそれらを見ることはできません。問題は私のコードが1/4のテストだけを通過することです。 – sssemil