
お世話になります。配列の中に同じ数が存在する数がいくつあるかを調べたいのですが、途中でつまづいてしまいました。
例えば配列arrayの中に、0, 0, 5, 0, 5, 1, 5といった数が格納されているとしたら
複数ある数は0と5の2つなので、2を返す、というだけのプログラムです。
int n=array.length;
int cnt=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(array[i]==array[j]){
cnt++;
break;
}
}
}
return cnt;
forループで配列0から同じ数を順番に調べ、もしヒットすればカウントを増やして内側のループをブレイクし、配列1からまた順番に調べようとしたのですが、
上の例の場合、配列0と配列1が同じ数(0)ですので、カウントが余計に増えてしまいます。
どのように組めばうまく動作するでしょうか。宜しくお願いします。
No.4ベストアンサー
- 回答日時:
>ソートしたあとでも同じ数が連続してしまうので、どのようにしてカウントすればいいのでしょうか・・・
int cnt = 0;
int t = 0; //現在調べている数値が最初に出てくる位置
for( int i = 1 ; i < n ; i ++ ) {
if( array[t] != array[i] ) {
//今までと違う数値になった
if ( i > t +1) {
//次の数値の先頭(i)のが、現在の数値の先頭の隣(t+1)より大きかったら
//現在の数値は2つ以上あったということ
cnt ++ ;
}
//次からは、iの位置を先頭として調べる
t = i;
}
}
//配列の最後に重複があっても(array[t] != array[i])で判定ができないので
//ループの外で判定する
if ( n > t + 1) {
cnt ++ ;
}
No.3
- 回答日時:
アイディア1)
集計済を示すboolean配列(長さはarrayと同じ)を作って(checkedとでもしておく)、falseで初期化しておく。
重複していたら、 checkedの対応する要素をtrueにする。
checkedがtrueならすでに確認済なので次へ。
int n=array.length;
int cnt=0;
boolean[] checked = new boolean[n] ;
java.util.Arrays.fill(checked,false);
for(int i=0;i<n;i++){
//array[i]がすでに重複として判定済なら次へ
if ( checked[i] ) {continue ;}
//重複があったことを示すフラグ
boolean isdup = false ;
for(int j=i+1;j<n;j++){
//array[j]がすでに重複として判定済なら次へ
if ( checked[j] ) {continue ;}
if ( array[i]==array[j]) ){
//全部の重複要素をchecked=trueにするためにbreakしない
checked[j]= true ;
//breakしない代りに、重複があったことを示すフラグを立てる
isdup= true ;
}
}
if ( isdup ) {
checked[i] = true ;
//重複があったらcntをインクリメント
cnt++;
}
}
return cnt;
}
アイディア2)
重複したものは配列から削除→残っている配列について重複確認
元の配列を保存するため、あらかじめコピーを作っておく必要がある
アイディア3)
arrayをソート。同じ値が並ぶので順番に数を数える
元の配列を保存するため、あらかじめコピーを作っておく必要がある
この回答への補足
みなさん ありがとうございます!ソートで調べる方法を試してみようと思い、まずソートを作りました。
int[] a = { 0, 0, 5, 0, 5, 1, 5 };
int n = a.length;
int temp = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
ここで質問なのですが、ソートしたあとでも同じ数が連続してしまうので、どのようにしてカウントすればいいのでしょうか・・・
No.2
- 回答日時:
(案1)
チェックする配列と同じ要素数を持つboolean配列を用意し、
対象配列番号が重複検出済みかどうかを表すフラグとして使う。
重複数値(array[i]==array[j])を見つけたら、
その配列番号の重複検出済みフラグをONにする。
(jのループはbreakしないで、他の同じ数値も重複検出済みに
する必要がある。cnt++はjのループ後にする。)
各配列の数値をチェックする前に、重複検出済みフラグが
ONか確認し、ONだったら、チェックをスキップする。
(案2)
チェックする配列の半分の要素数を持つint配列を用意し、
「重複数値格納配列」として使用する。
同じ数値(array[i]==array[j])を見つけたら、
「重複数値格納配列」にその数値を格納し、
格納位置の配列番号をカウントアップする。
各配列の数値をチェックする前に、「重複数値格納配列」
の中にこれからチェックする数値が存在するか
確認し、存在していたらチェックをスキップする。
「重複数値格納配列」の最終格納位置が、重複数値
検出数になる。
(案3)
配列を一旦小さい順にソートしてからチェックする。
ソートアルゴリズムは有名なものを参考に。
その後のチェックの仕方はわかると思います。
どれが一番効率いいんでしょうね・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
同じ配列またはクラスを、2回...
-
C#で動的配列Listの中身をListB...
-
javaについて
-
配列について
-
Javaで文字と数字が混ざったも...
-
ページング
-
C#で配列の戻り値について
-
配列数を超えてアクセスしたと...
-
バイト配列
-
この警告はどうすれば?
-
半角カナの判別方法
-
OrqngeSignal CSVの設定について
-
多次元配列のソートがうまくい...
-
セッションを使ったint型の値の...
-
java 乱数を並べて重複させない...
-
java HashMapのキーをkeySet()...
-
strutsでの配列の扱い方について。
-
配列で、値の入っている要素数...
-
教えて下さい。for文内での変数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
フローチャート
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
C#で動的配列Listの中身をListB...
-
配列の中に複数存在する数がい...
-
セッションを使ったint型の値の...
-
【C#】ハッシュテーブル(連想...
-
javaについて
-
javaでの文字列からの数字抽出
-
配列について
-
javaで大容量テキストファイル...
-
配列数を超えてアクセスしたと...
-
【Ajax通信&Java】配列の受け取...
-
『args[]』とは?
-
ArrayListからBean配列に値をセ...
-
C言語でunsigned char配列を連...
-
strutsで2次元配列をやりとりす...
-
javamailで複数人にメールを送...
おすすめ情報