自分自身を監督する-特定のゲストネットワーク(Java)の3つのプログラミングの質問-文字列、セット、配列

特定の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ビットを接続します。
ここに画像の説明を挿入

毎日自分を促し、一緒に来てください!
同時に、より良い実践があります、議論することを歓迎します。

おすすめ

転載: blog.csdn.net/qq_45841205/article/details/115218934