1. 程式人生 > >CCF——數字排序

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的排序結果,肯定有問題   解決辦法:           &