假設我有一個這樣的陣列:
int array[]={1, 2, 2, 1, 2, 4, 4, 5};
我只想顯示所有重復元素一次,顯示它們對應的頻率并計算重復元素總數。我搜索了很多,但每個解決方案都是針對只有 2 個重復元素的陣列。
void non_unique_numbers(int arr[], int size){
int i,j;
int frequency[Frequency_size]={0};
for(i=0; i<size; i ){
for(j=0; j<size; j ){
if(arr[i]==arr[j] && i!=j){
frequency[arr[j]];
printf("Number: %d , Frequency: %d\n", arr[j], frequency[j]);
}
}
}
}
當我運行它時,我的輸出是:
Number: 1 , Frequency: 3
Number: 2 , Frequency: 1
Number: 2 , Frequency: 1
Number: 2 , Frequency: 1
Number: 2 , Frequency: 2
Number: 1 , Frequency: 0
Number: 2 , Frequency: 2
Number: 2 , Frequency: 6
Number: 4 , Frequency: 0
這是沒有意義的。如何將每個重復元素顯示一次并找出它們對應的頻率?
uj5u.com熱心網友回復:
您需要兩個回圈,而不是嵌套回圈。
一是計算頻率。并且,另一個顯示頻率并計算重復數字的總數。
這是重構后的代碼:
編輯:我在第二次更新期間洗掉了損壞的原始代碼。
更新:
是的,但它仍然不止一次地顯示相同的元素——悟空
哎呀,我的錯……這是在第二個回圈中索引頻率表的一個:
#include <stdio.h>
#define Frequency_size 10000
void
non_unique_numbers(int arr[], int size)
{
int i;
int freq;
int totdup = 0;
int frequency[Frequency_size] = { 0 };
// calculate freqency
for (i = 0; i < size; i )
frequency[arr[i]];
for (i = 0; i < Frequency_size; i ) {
freq = frequency[i];
if (freq <= 0)
continue;
printf("Number: %d , Frequency: %d\n", i, freq);
if (freq >= 2)
totdup;
}
printf("The number of duplicated numbers is: %d\n",totdup);
}
更新#2:
我們可以讓它也適用于負面因素嗎?
for (i = 0; i < Frequency_size; i ) { freq = frequency[i]; if (freq <= 0) continue; printf("Number: %d , Frequency: %d\n", i, freq);由于這部分它不適用于負整數 – goku
是的,我們只需要為負數頻率使用第二個陣列,并通過負數的負數來索引它。(即)我們使用相應的正指數。
此外,有些人評論說要進行范圍檢查,所以我添加了一些關于超出范圍值的統計資料 [如果有的話]。我還更新了if測驗,以便只列印重復的數字。
再一次,我已經編譯了這個但沒有測驗它,但它應該沒問題:
#include <stdio.h>
#include <string.h>
#define Frequency_size 10000
void
non_unique_numbers(const int *arr, int size)
{
int i;
int freq;
int val;
int totdup = 0;
int pos_badcnt = 0;
int pos_badmax = 0;
int neg_badcnt = 0;
int neg_badmax = 0;
static int freq_pos[Frequency_size];
static int freq_neg[Frequency_size];
// set frequency counts to zero
memset(freq_pos,0,sizeof(freq_pos));
memset(freq_neg,0,sizeof(freq_neg));
// calculate freqency
for (i = 0; i < size; i ) {
val = arr[i];
// handle positive number(s)
if (val >= 0) {
if (val >= Frequency_size) {
pos_badcnt;
if (val > pos_badmax)
pos_badmax = val;
}
else
freq_pos[val];
}
// handle negative number(s)
else {
// index frequency array with positive index -- that's the trick
val = -val;
if (val >= Frequency_size) {
neg_badcnt;
if (val > neg_badmax)
neg_badmax = val;
}
else
freq_neg[val];
}
}
// for negative numbers, skip 0 and show lowest (most negative) first
for (i = Frequency_size - 1; i >= 1; --i) {
freq = freq_neg[i];
if (freq <= 1)
continue;
printf("Number: %d , Frequency: %d\n", -i, freq);
totdup;
}
// show positive number frequencies
for (i = 0; i < Frequency_size; i ) {
freq = freq_pos[i];
if (freq <= 1)
continue;
printf("Number: %d , Frequency: %d\n", i, freq);
totdup;
}
printf("The number of duplicated numbers is: %d\n",totdup);
// show out of range negative number stats
if (neg_badcnt > 0) {
printf("There were %d out of range negative numbers\n",neg_badcnt);
printf("Smallest out of range negative number was %d\n",-neg_badmax);
}
// show out of range positive number stats
if (pos_badcnt > 0) {
printf("There were %d out of range positive numbers\n",pos_badcnt);
printf("Largest out of range positive number was %d\n",pos_badmax);
}
}
uj5u.com熱心網友回復:
你可以試試這個。
void non_unique_numbers(int arr[], int size){
int i,j;
for(i=0; i<size; i )
{
int frequency=0;
bool wasFoundEarlier=false;
for(j=i; j<size; j )
{
if(arr[i]==arr[j])
{
frequency ;
}
}
for(int x=0;x<i;x )
{
if(arr[x]==arr[i])
{
wasFoundEarlier=true;
}
}
if(!wasFoundEarlier)
{
printf("Number: %d , Frequency: %d\n", arr[i], frequency);
}
}
}
這將列印所有元素的頻率。
如果您只想列印重復頻率,只需更改內回圈
for(j=i 1; j<size; j )
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/364732.html
標籤:C
