これは私の最初の投稿です。サイトの投稿ガイドラインに準拠していることを願っています。まず最初に、すべてのコミュニティに感謝します: 数か月にわたってあなたを読んで、多くのことを学びました :o)
前提: 私は IT の 1 年生です。
質問は次のとおりです。指定された正の int 配列内の一意のペア (正確に 2 回表示される数値) の数を効率的にカウントする方法を探しています (それが私が知っているすべてです)。たとえば、次の場合:
int[] arr = {1,4,7,1,5,7,4,1,5};
arr の一意のペアの数は 3 (4,5,7) です。
私はいくつかの困難を抱えています...私の提案の効率を評価するとしましょう。
これが私がした最初のコードです:
int numCouples( int[] v ) {
int res = 0;
int count = 0;
for (int i = 0 ; i < v.length; i++){
count = 0;
for (int j = 0; j < v.length; j++){
if (i != j && v[i] == v[j]){
count++;
}
}
if (count == 1){
res++;
}
}
return res/2;
}
これは、指定された配列内の要素の数と同じ回数だけ指定された配列全体をチェックするため、良いことではありません...間違っている場合は修正してください。
これは私の2番目のコードです:
int numCouples( int[] v) {
int n = 0;
int res = 0;
for (int i = 0; i < v.length; i++){
if (v[i] > n){
n = v[i];
}
}
int[] a = new int [n];
for (int i = 0; i < v.length; i++){
a[v[i]-1]++;
}
for (int i = 0; i < a.length; i++){
if (a[i] == 2){
res++;
}
}
return res;
}
nが指定された配列の最大値である場合、指定された配列の2倍とn配列の1倍のみをチェックするため、これは最初のものよりも優れているはずです。nがかなり大きい場合、あまり良くないかもしれません...
さて、2つの質問:
コードの効率を「測定」する方法をよく理解していますか?
特定の配列内の一意のペアの数をカウントするより良い方法はありますか?
編集:投稿したばかりで、すでに回答に圧倒されています!ありがとう!私は慎重にそれぞれを研究します.当分の間、私はHashMapに関連するものを取得していないと言います.私の知識ではまだです.