まず、文字の全額を設定し、文字セットが占有します
説明を入力します。
占有と文字セットの合計量を含む文字列を入力し、文字セットは2つの@に接続されています。@文字セットが占有文字のセットです後に@文字の前の文字は、全体のコレクションのために金額を設定します。占領下の文字セットは、文字セットの文字の全額である必要があります。文字と文字のセット間の区切りにはカンマを使用します。文字のセットに加えて文字の数など、コロンで区切られた英語の数字と文字として表される:1、1文字を表します。文字だけの文字を考えてみましょう、大文字と小文字を区別し、正の数は、唯一の文字が占有されなかった場合など、まだ@識別子、、、100以上ではないの数を形作る考える:3、B:5、C:2 @
出力説明:
使用可能な文字セット。出力復帰改行。
例1:
入力:3、B:5、C:@ 2:1、B:2
出力:2、B:3、C:2
注:3つの文字、5番目のBの合計量、2番目C。占領下の文字セットはA、2番目のbです。占有文字セットは、従って、残りの利用可能な文字2、3番目のB、2 Cを再利用することができないからです。したがって、出力:2、B 3、C:2。文字列の入力が同じ出力を維持することに注意してください。することはできません出力b:3:2、C:2。文字がすべて占有されている場合は、出力なし。例えば:3、B:5、C:3、B:2、出力B:@ 2 3、C:2。
アイデア:
この質問は、文字列の分割、スプライスに主に関連しています。。。
ここに私自身のコードは、任意の改善であれば、大歓迎です!
public class HuaWei_08_07 {
public static void main(String[] args){
String s="a:3,b:5,c:2@a:3,b:1";
HuaWei_08_07 hua=new HuaWei_08_07();
String useStr=hua.UserStrings(s);
System.out.print(useStr);
}
public String UserStrings(String s){
String[] str=s.split("@");
if(str.length==1){
return str[0];
}
Map<String,Integer> map=new HashMap<>();
for(int i=0;i<str.length;i++){
map=putmap( map,str[i].split(","),i);
}
StringBuffer buf=new StringBuffer();
for(String key:map.keySet()){
if(map.get(key)!=0) {
buf.append(key+":"+map.get(key)+",");
}
}
String s1=buf.toString();
return s1.substring(0,s1.length()-1);
}
public Map<String,Integer> putmap(Map<String,Integer> map,String[] str,int flag){
for(int i=0;i<str.length;i++){
String s2=str[i].split(":")[0];
int a=Integer.parseInt(str[i].split(":")[1]);
if(flag==1&&map.containsKey(s2)){
int b=map.get(s2)-a;
map.put(s2,b);
}else{
map.put(s2,a);
}
}
return map;
}
}
二、トライ木
件名の説明:
以下は、トライ木であり、円は各マーカーについて0~255の間の値の範囲に、子ノード点を内部ノードを表し、各内部ノード256個のノードに子を有しています。三角形は、各リーフノードは完全なキーを形成するために、リーフノード間のパス上のすべての文字に値が、ルートノードを格納するリーフノードを表します。
説明を入力します。
最初のデジタルライン1 Mは、三列に続くラベル、HasChild、POUDSアレイのサイズは、ラベルを表す表すHasChild、スペースで区切られた配列の内容をPOUDS。デジタル回線5つのN値は、配列値は、コンテンツを表すラインに続く、配列のサイズを表します。デジタルライン7は、キー配列のサイズを表し、そして1つの銀行は、文字のキー配列を探すために言いました。
出力説明:
キーが存在しない場合は、出力ラインに対応するキー値、出力0。
例1:
入力:
15
115 112 116 97 111 121 114 101 105 112 121 114 102 115 116
0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
1 1 0 1 0 1 1 1 0 0 0 1 1 0 0
8
1 2 3 4 5 6 7 8
3
116 114 112
出力:
7
第三に、論理的なコンピューティング
件名の説明:
そして、一般的なロジックの計算は(&と表記)がある;または(と表記|);(として示されている!)されていません。その中で、自分の優先順位の関係ではありません>と(&)>または(!)(|)。
説明を入力します。
図1に示すように、スペースなしのテストケースの中央に関係なく、スペースの。
2、テストケース式は唯一の文字として表示されます。 "0"、 "1"、 "("、 ")"、 "&"、 "|"、 "!"。
3、テストケースは、入力に正当な入力、不法入国を検討する必要はありませんです。
4、テストケースは、長さが128文字を超えません。
図5に示すように、ブラケットは、ネストされた繰り返してもよいです。
例えば:
1 |(1&0)戻り値:1
1&0 | 0&1戻り値:0
!0&1つの| 0戻り値:1
((0&1)!)| 0戻り値:1
出力説明:
論理演算の出力の最終結果:0または1
例1:
入力:!(1&0)| 0&1
出力:1
例2:
入力:(1&0)&0 | 0!
出力:0
最初の解決策:関数を呼び出します
/**第一种 调用函数*/
public static void Pipei(String s){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result=null;
try {
result = engine.eval(s);
} catch (Exception e) {
e.printStackTrace();
}
}
第二:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int k = 0;
while (input.length() != 1) {
input = input.replaceAll("!1", "0");
input = input.replaceAll("!0", "1");
input = input.replaceAll("1&0", "0");
input = input.replaceAll("0&1", "0");
input = input.replaceAll("0&0", "0");
input = input.replaceAll("1&1", "1");
input = input.replaceAll("1\\|0", "1");
input = input.replaceAll("0\\|1", "1");
input = input.replaceAll("0\\|0", "0");
input = input.replaceAll("1\\|1", "1");
input = input.replaceAll("\\(1\\)", "1");
input = input.replaceAll("\\(0\\)", "0");
k++;
if (k > 20) break;
}
System.out.println(input);
sc.close();
}