CCF——數字排序
問題描述:
給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。
輸入格式
輸入的第一行包含一個整數n,表示給定數字的個數。
第二行包含n個整數,相鄰的整數之間用一個空格分隔,表示所給定的整數。
輸出格式
輸出多行,每行包含兩個整數,分別表示一個給定的整數和它出現的次數。按出現次數遞減的順序輸出。如果兩個整數出現的次數一樣多,則先輸出值較小的,然後輸出值較大的。
樣例輸入
12
5 2 3 3 1 3 4 2 5 2 3 5
樣例輸出
3 4
2 3
5 3
1 1
4 1
約束
1 ≤ n ≤ 1000,給出的數都是不超過1000的非負整數。
解題思路:
這題一看,說難也不難,說容易也不容易,不就是統計重複數字的個數嗎,從頭開始遍歷,找相等不就行了,不過要輸出是哪個數出現了多少次,按照題目的輸出要求(出現次數多的優先輸出,次數相同的,將小的那個數優先輸出)的確不太容易。
1、定義兩個一維陣列,一個用來儲存值,一個用來儲存該數出現的次數。輸入完畢之後,先對儲存值的那個陣列進行從小到大的排序,再統計下值出現的次數,存入到另外一個數組裡面,最後從統計次數裡面的陣列選出最大的值,再來一次遍歷即可完成題目要求。
Code:
#include <iostream>
using namespace std;
#define MAX 1005
int a[MAX] = { 0 }, b[MAX] = { 0 }; //a用來儲存值,b用來存次數
int main()
{
int n;
while (cin >> n)
{
int k = 0;
for (int i=0;i<n;i++)
{
cin >> a[i];
b[i] = 1; //先進行初始化
}
//進行從小到大排序
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++)
{
if (a[i]>a[j])
swap(a[i], a[j]); //利用函式庫中的swap函式,如果記不住,那可以採用以下程式碼
/*if(a[i]>a[j])
{
int t;
t=a[i];
a[i]=a[j];
a[j]=t;
}*/
}
//這步統計次數,是關鍵,統計錯誤,這題就GG了
for (int i = 1; i < n; i++)
{
if (a[i] == a[i-1])
{
b[i] = b[i - 1] + 1;
b[i - 1] = 0;
}
}
//選取次數最大的那個
for (int i=0;i<n;i++)
{
if (b[i]>k)
{
k = b[i];
}
}
//遍歷輸出
for (int i=k;i>=1;i--)
for (int j=0;j<n;j++)
{
if (i==b[j])
{
cout << a[j] << " " << i << endl;
}
}
}
return 0;
}
2、第一種方案思路方面還是比較清晰,那能否用一個一維陣列呢,答案當然是可以的,
那怎麼進行存數和統計次數呢,如果用一個一維陣列的下標當做值,所存的資料表示該數的次數,只需將該數的次數最大的那個表示出來,然後逐個遞減輸出相應的下標值就行了。
Code:
#include <iostream>
using namespace std;
#define MAX 1005
int a[MAX] = { 0 };
int main()
{
int n;
while (cin >> n)
{
int k = 0;
memset(a, 0, sizeof(a));
for (int i = 0; i < n; i++)
{
int m;
cin >> m;
for (int j = 0; j < MAX; j++)
{
if (j == m)
{
a[j]=a[j]+1;
}
}
}
//選擇最大的數
for (int i=0;i<MAX;i++)
{
if (a[i]>k)
{
k = a[i];
}
}
//進行選擇性輸出
for (int i=k;i>=1;i--)
{
for (int j=0;j<MAX;j++)
{
if (i==a[j])
cout << j << " " << i << endl;
}
}
}
return 0;
}
3、既然是一維陣列,那我也可以採用結構體陣列來進行,定義一個結構體陣列,包含兩個成員,一個代表值,一個代表該值所存在的次數,這也蠻符合題目要求的,統計相同的次數,然後排下序,再輸出。如果用C++的容器會更好一點。
Code:
#include <iostream>
#include <string.h>
using namespace std;
#define MAX 1005
//如果採用C++所提供的容器會更好一點
typedef struct
{
int value;
int index;
}Node;
Node vector[MAX];
int main()
{
int n;
while (cin >> n)
{
int k = 0;
memset(vector, 0, sizeof(vector));
for (int i = 0; i < n; i++)
{
int m;
cin >> m;
for (int j = 0; j < MAX; j++)
{
if (j == m)
{
vector[j].value = j;
vector[j].index++;
}
}
}
//sort
for (int i = 0; i < MAX; i++)
{
if (vector[i].index == 0)
continue;
for (int j = i+1; j < MAX; j++)
{
if (vector[j].index == 0)
continue;
if (vector[i].index < vector[j].index)
{
int t = vector[i].index;
vector[i].index = vector[j].index;
vector[j].index = t;
t = vector[i].value;
vector[i].value = vector[j].value;
vector[j].value = t;
continue;
}
if (vector[i].index==vector[j].index)
if (vector[i].value>vector[j].value)
{
int t;
t = vector[i].value;
vector[i].value = vector[j].value;
vector[j].value = t;
continue;
}
}
}
for (int i = 0; i < MAX; i++)
{
if (vector[i].index == 0)
continue;
cout << vector[i].value << " " << vector[i].index << endl;
}
}
return 0;
}
4、採用陣列每次開銷記憶體都蠻大的,可以使用連結串列進行存值,在排序,最後依次輸出。
相關推薦
ccf數字排序
一行 數組下標 多行 string CP 空格 stream iostream 評測 問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。 第二行包含n個整數,相鄰的整數之間
ccf 數字排序
{201503-2試題名稱:數字排序時間限制:1.0s記憶體限制:256.0MB問題描述:問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。輸入格式 輸入的第一行
CCF——數字排序
問題描述: 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。 第二行包含n個整數,相鄰的整數之間用一個空格分隔,表示所給定的整數。 輸出格式 輸出多行,
CCF計算機職業資格認證 2015年3月第2題 數字排序 解法和思路
integer pack 可能 edit val tree cli 提交 edi 問題描寫敘述 給定n個整數,請統計出每一個整數出現的次數,按出現次
201503-2-數字排序-CCF
題目:http://118.190.20.162/view.page?gpid=T26 解題思路:先用一個數組vs[N],i表示值,vs[i]表示次數,再放入結構體陣列中,用sort排序解決。 #include<iostream> #include<cstdio
CCF 201503-2數字排序
試題編號: 201503-2 試題名稱: 數字排序 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸
CCF認證 201503-1 影象旋轉(100分) 201503-2 數字排序(100分)
CCF認證2015-03-1 影象旋轉 問題描述 旋轉是影象處理的基本操作,在這個問題中,你需要將一個影象逆時針旋轉90度。 計算機中的影象表示可以用一個矩陣來表示,為了旋轉一個影象,只需要將對應的矩陣旋轉即可。 輸入格式 輸入的第一行包含兩個整數n
CCF CSP認證考試歷年真題 數字排序 C語言實現
試題編號:201503-2 試題名稱:數字排序 時間限制:1.0s 記憶體限制:256.0MB 問題描述: 問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。第二行包含n個整數,相鄰
ccf 201503-2 數字排序(100分)
問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。 第二行包含n個整數,相鄰的整數之間用一個空格分隔,表示所給定的整數。 輸出格式 輸出多行,每行包含兩個整數,分別表示一個
#CCF準備一年日常刷題#201503-2 數字排序
問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。 第二行包含n個整數,相鄰的整數之間用一個空格分隔,表示所給定的整數。 輸出格式 輸出多行,每行包含兩個
CCF 201503-2 數字排序
試題編號: 201503-2 試題名稱: 數字排序 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸
冒泡算法給0~9隨機n位數字排序
排序 mage range ech gin 判斷 src nbsp body <?php //產生5位0~9的隨機數 function getRand($begin=0,$end=9,$limit=5){ $rand_array
JavaScript按純數字排序
.so -s 乒乓球 return clas turn com java alt 直接上代碼: 1 var arr=[ 2 {name:"張散步",age:"23",sports:"籃球",number:"231123"},
JDK8Stream 數字排序
JDK8Stream 數字排序 package question; import java.util.ArrayList; import java.util.List; public class JDK8Stream { public static void main(String[]
Java練習:用IF()進行數字排序
新手學習import java.util.Scanner; /** Created by Administrator on 2018/4/19 0019.//*Compare.java 比較輸入值得大小並輸出 v.1*/public class Compare {public static void
把數字排序 —— 倒序
span bsp ... int data IT 倒序 return color 1 function descendingOrder(n){ 2 //... 3 let arr = n.toString().split(‘‘) 4 let arr2
2018-07-28期 MapReduce實現對數字排序
ide 執行 微軟 author 處理 升序 .config microsoft 如果 package cn.sjq.mr.sort.number;import java.io.IOException;import org.apache.hadoop.io.LongWrit
perl 實現字符串中數字排序
pre 數字類型 數組排序 each cmp reac bsp ont 數組 數值類型數組排序使用: sort { $a <=> $b } @array; #升序排列 sort { $b <=> $a } @array; #降序排列 字符串
SQL SERVER 字串按數字排序
需求是這樣的: 資料庫表裡面有一個欄位型別是nvachar,存的值是數字和字元混合的,要實現先按數字排序,再按字母倒序。 思路: 考慮這個欄位的值是否是有規律可循的,把要按數字排序的部分轉換為數字,再把剩下的字元排序。 資料表是下面這樣的: LevelName就是那
解決 Order By 將字串型別的數字 或 字串中含數字 按數字排序問題
oracle資料庫,欄位是varchar2型別即string,而其實存的是數字,這時候不加處理的order by的排序結果,肯定有問題 解決辦法: &