特定のKewangプログラミング(Java)に関する3つの質問-文字列、セット、配列
最初の質問:
タイトル記述は
、文字列の中で一度だけ表示される最初の文字の検索
入力の説明を:
入力いくつかの非空の文字列の
出力の説明:
出力が存在しない場合は、一度だけ表示される最初の文字、出力-1
実施例1は、
入力してください
asdfasdfo
AABB
コピー
O
-1
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner input=new Scanner(System.in);
ArrayList<String>list=new ArrayList<>();
while(input.hasNext()){
list.add(input.nextLine());
}
for(String str:list){
Map<Character,Integer>map=new HashMap<>();
for(int i=0;i<str.length();++i){
char x=str.charAt(i);
if(!map.containsKey(x)){
map.put(x,1);
}else{
map.put(x,map.get(x)+1);
}
}
boolean flag=false;
for(int i=0;i<str.length();++i){
char x=str.charAt(i);
if(map.get(x)==1){
System.out.println(x);
flag=true;
break;
}
}
if(!flag){
System.out.println(-1);
}
}
}
}
基本的な考え方:HashMapを使用して1つずつマップし、見つかった番号に1つ追加し、見つからない場合はマップを入力します。最終的には、マップで番号1を見つけるだけで済みます。
なぜHashMapを選ぶのですか?
HashMapの追加、削除、チェック、および変更の時間計算量はO(1)であるためです。
2番目の質問:
タイトルの説明
n個の整数を入力し、最小のkを出力します。
while(cin >>)処理などの読み取りサイクルを使用した、入力サンプルの複数のセットのタイトル。
入力の説明:入力
の最初の行
2番目の行の2つの整数nおよびkは、整数配列の
出力の説明を入力します。:
小さい整数から大きい整数の配列を出力する
例1
入力
5 2
1 3 5
72出力
12
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner input=new Scanner(System.in);
while(input.hasNext()){
int n=input.nextInt();
int k=input.nextInt();
PriorityQueue<Integer>queue=new PriorityQueue<>(
new Comparator<Integer>(){
public int compare(Integer o1,Integer o2){
return o2-o1;
}
}
);
for(int i=0;i<n;++i){
int x=input.nextInt();
if(i<k){
queue.offer(x);
}else{
if(x<queue.peek()){
queue.poll();
queue.offer(x);
}
}
}
ArrayList<Integer>list=new ArrayList<>();
for(int x:queue){
list.add(x);
}
Collections.sort(list);
for(int x:list){
System.out.print(x+" ");
}
System.out.println();
}
}
}
基本的な考え方:大きなルートヒープを作成し、最初にK値を入力してから、ヒープの上部を最大にする必要があるため、上部の要素をKの後の要素と比較するだけで、ヒープの上部の要素は次のようになります。ヒープから出て、現在の要素がヒープに追加されます。最終的に、ヒープにはK個の最小要素のみが残り、ソートされた出力のみが使用されます。
注:コレクション内のPriorityQueueは、デフォルトでは小さなルートヒープであるため、コンパレータを書き換える必要があります。
質問3:
タイトルの説明
文字列で表される2つの整数を入力し、それらが表す数値の合計を求めます。
文字列の長さは10,000を超えません。
この質問には、複数のサンプル入力のセットが含まれています。
入力の説明:
2つの文字列を入力します。文字列に「0」〜「9」文字のみが含まれていることを確認します。
出力の説明:
合計の結果を出力します。
例1
入力
98765432101234567890
および
出力
11111111100
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner input=new Scanner(System.in);
ArrayList<String>list=new ArrayList<>();
while(input.hasNext()){
String str1=input.next();
StringBuilder s1=new StringBuilder();
s1.append(str1);
String str2=input.next();
StringBuilder s2=new StringBuilder();
s2.append(str2);
StringBuilder end=new StringBuilder();
while(s1.length()<s2.length()){
s1.insert(0,'0');
}
while(s1.length()>s2.length()){
s2.insert(0,'0');
}
int c=0;
for(int i=s1.length()-1;i>=0;i--){
char x=s1.charAt(i);
char y=s2.charAt(i);
int re=(x-'0')+(y-'0')+c;
if(re<10){
end.insert(0,re);
c=0;
}else{
end.insert(0,re%10);
c=1;
if(i==0){
end.insert(0,c);
}
}
}
System.out.println(end.toString());
}
}
}
基本的な考え方:
入力文字列の長さが非常に長い可能性があるため、Long型の数値の長さは長すぎないため、Integer.valueOfによる変換を行ってから計算することは除外されています。方法はありませんか?しない!実際、それは非常に簡単です。文字列を後ろから前に1つずつ数えるだけで済みますが、キャリーがあるかどうかを考慮する必要があります。最終結果を得るには、計算の各ビットに1ビットを接続します。
毎日自分を促し、一緒に来てください!!!!!!!!!!!
同時に、より良い実践があります、議論することを歓迎します。