6.3.7 數字統計
要求:統計一個整數中出現最多的數字。如果數字個數一樣,則以最大的數字為准,例如1輸出1,121輸出1,23231輸出3。
該題是一個綜合的題目,在實際分析時可以分解成三個問題:1、把整數中的每個數字拆分出來,2、統計拆分出的數字中0-9每個的個數,3、獲得數字個數的最大值。
實現思路:
1、拆分數字:整數和10取余可以獲得該整數的個位值,然後用該整數除以10可以去掉個位(整數除法),按照這種結構實現循環,並把拆分出的數字(也就是余數)存儲到數組中。
2、統計數字:聲明一個長度是10的整型數組,使用這個數組中的第一個元素保存數字0出現的次數,第二個元素保存數字1出現的次數,依次類推。使用循環實現數字個數的統計。
3、獲得最大值對應的數字:獲得個數數組中最大值的下標,就是需要的數字。
則實現的代碼如下:
int m = 1232312;
int[] n = new int[10]; //存儲拆分後的數字
int num = 0;//存儲拆分出的數字個數
while(m != 0){ //未拆分完
n[num] = m % 10; //獲得個位數字
num++; //拆分出的數字個數加1
m /= 10; //去掉拆分出的數字
}
int[] count = new int[10];//存儲0-9數字出現的次數
//統計數字出現的次數
for(int i = 0;i < num;i++){
count[n[i]]++;
}
//獲得最大值的下標
int index = 0;
for(int i = 0;i < count.length;i++){
if(count[index] <= count[i]){
index = i;
}
}
//輸出
System.out.println(index);
在該代碼中,拆分的十進制的數字,首先拆分出個位,並存儲到n數組中,然後通過除10去掉拆分出的數字,繼續執行循環,一直運算到m為0時為止,變量num保存拆分出的數字的個數。使用數組count記憶0-9每個數字出現的次數,count[0]存儲0出現的次數,count[1]存儲1出現的次數,依次類推,所以當n[i]的值為幾時,只需要count[n[i]]增加1即可。最後使用循環獲得最大數字的下標,適用<=進行比較,可以保證當個數相同時取後續的數字,這樣就可以通過循環獲得最大數值的下標,按照數組count的結構,數組的下標和就是數字的值。
6.3.8 數組編碼
要求:設有一數組A,長度是N,內部的數據是0到N-1之間的所有數字,例如當N等於5時,數組為:A={0,3,2,1,4}。針對A數組,有一個對應的編碼數組B,B的長度和A的長度相等,規定數組B中元素的值規定如下:
a、B[0]的值為0
b、B[i]的值是A數組中A[i]以前的值中比A[i]小的元素的個數。
c、例如示例中A數組{0,3,2,1,4}對應的編碼數組B的值為{0,1,1,1,4}。
現在已知A數組,編碼代碼計算對應的編碼數組B。
該題是一個基本的數組變換題目,只要熟悉了題目的要求以後,按照題目的要求求解對應的數組B即可。
實現思路:初始化一個長度和A數組一樣的B數組,初始化第一個元素的值為0,循環統計比A[i]元素小的數字個數,把個數值賦值給對應的B[i]即可。
則實現的代碼如下:
int[] A = {0,3,2,1,4};
int[] B = new int[A.length];
B[0] = 0;//初始化第一個元素,可選
for(int i = 1;i < A.length;i++){
int count = 0;//計數變量
//統計小於A[i]元素的數量
for(int j = i - 1;j >= 0;j--){
if(A[j] < A[i]){
count++;
}
}
B[i] = count; //賦值
}
該代碼中,按照數組B中值的規定,統計A[i]以前比A[i]小的元素個數,然後把得到的結果賦值給B[i]即完成題目的要求。
6.3.9 數組排序
要求:將數組中的元素按照從小到大的順序(升序)進行排列。
數組的排序是實現很多數組操作的基礎,在實際使用時也有很多的排序方法,這裡以冒泡排序為例來說明數組的排序算法。
實現思路:每次排序一個元素,總的排序次數是數組的長度減1次。第一次時,首先比較第一個和第二個元素,如果第一個元素比第二個元素大,則交換這兩個元素的值,然後比較第二個和第三個元素,如果第二個比第三個大則交換,依次類推,這樣當第一次交換完成以後,數組中的最後一個元素一定是數組中最大的元素。第二次時,只比較數組的前長度減一個元素,比較步驟和第一次相同,依次類推,每次都少比較一個元素,最終獲得的就是排序完成的數組。
則實現的代碼如下:
int[] m = {2,10,3,4,2};
for(int i = 0;i < m.length - 1;i++){ //排序次數
//兩兩比較,實現排序
for(int j = 0;j < m.length - 1 - i;j++){
if(m[j] > m[j + 1]){
//交換
int temp = m[j];
m[j] = m[j + 1];
m[j + 1] = temp;
}
}
}
//輸出排序後的元素
for(int i = 0;i < m.length;i++){
System.out.println(m[i]);
}
冒泡排序通過數組中元素的兩兩比較和交換,實現數組中元素的排序。其中循環變量為i的循環代表排序的次數,總的排序次數是數組的長度減1次。內部的循環變量為j的循環實現未排序元素的兩兩比較,其中循環條件可以保證i增加1,內部比較的元素減少1,這個在功能上就是不比較排過序的元素。