1. 程式人生 > >藍橋杯(java):數列特徵,查詢整數,楊輝三角,特殊的數字,迴文數

藍橋杯(java):數列特徵,查詢整數,楊輝三角,特殊的數字,迴文數

人生無趣,生活不易,一起找點樂子吧。

 

 

數列特徵:

問題描述
給出n個數,找出這n個數的最大值,最小值,和。

輸入格式
第一行為整數n,表示數的個數。

第二行有n個數,為給定的n個數,每個數的絕對值都小於10000。

輸出格式
輸出三行,每行一個整數。第一行表示這些數中的最大值,第二行表示這些數中的最小值,第三行表示這些數的和。
樣例輸入
5
1 3 -2 4 5
樣例輸出
5
-2
11
資料規模與約定
1 <= n <= 10000。

思維還一直處在python裡,直接就max(),min()了。查了下,有max函式的是collection,不會用,有會的,評論寫下面吧。

import java.util.*;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int arr[] = new int[n];
		for(int i = 0;i<n;i++){
			arr[i] = sc.nextInt();
		}
		sc.close();
		
		int max = arr[0];
		int min = arr[0];
		int sum = 0;
		for(int i = 0;i<arr.length;i++){
			if(arr[i]>max){
				max = arr[i];
			}
			if(arr[i]<min){
				min = arr[i];
			}
			sum += arr[i];
		}
		System.out.println(max);
		System.out.println(min);
		System.out.println(sum);
		
	}
}

 

迴圈遍歷了一遍,找最大最小值,順便求了累加,用於求平均。

 

 

查詢整數:

問題描述
給出一個包含n個整數的數列,問整數a在數列中的第一次出現是第幾個。

輸入格式
第一行包含一個整數n。

第二行包含n個非負整數,為給定的數列,數列中的每個數都不大於10000。

第三行包含一個整數a,為待查詢的數。

輸出格式
如果a在數列中出現了,輸出它第一次出現的位置(位置從1開始編號),否則輸出-1。
樣例輸入
6
1 9 4 8 3 9
9
樣例輸出
2
資料規模與約定
1 <= n <= 1000。

這個貌似也沒有說的點,交給python的話直接list.find(int)就好了,java只會用陣列,如果大家有其他的簡單資料結構,下面評論。迴圈遍歷查詢,返回下標,迴圈完未找到,立個flag做個標記就好。

import java.util.*;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int arr[] = new int[n];
		for(int i = 0;i<n;i++){
			arr[i] = sc.nextInt();
		}
		int a = sc.nextInt();
		sc.close();
		
		int state = 0;
		for(int i = 0;i<arr.length;i++){
			if(arr[i] == a){
				System.out.println(i+1);
				state = 1;
				break;
			}
		}
		
		if(state == 0){
			System.out.println(-1);
		}
		
	}
}

 

 

楊輝三角:

問題描述
楊輝三角形又稱Pascal三角形,它的第i+1行是(a+b)i的展開式的係數。

  
它的一個重要性質是:三角形中的每個數字等於它兩肩上的數字相加。

  
下面給出了楊輝三角形的前4行:

  
   1

  
  1 1

  
 1 2 1

  
1 3 3 1

  
給出n,輸出它的前n行。

輸入格式
輸入包含一個數n。

輸出格式
輸出楊輝三角形的前n行。每一行從這一行的第一個數開始依次輸出,中間使用一個空格分隔。請不要在前面輸出多餘的空格。
樣例輸入
4
樣例輸出
1
1 1
1 2 1
1 3 3 1
資料規模與約定
1 <= n <= 34。

資料規模在34以下,做個34*34的陣列儲存就好了,前兩行的資料手動寫出,剩下的由計算給出,陣列生成後,迴圈遍歷輸出每行即可。

import java.util.*;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		
		int list[][] = new int[34][34];
		list[0][0] = 1;
		list[1][0] = 1;
		list[1][1] = 1;
		for (int i = 3;i<=34;i++){
			list[i-1][0] = 1;
			for(int j = 1;j<=i-2;j++){
				list[i-1][j] = list[i-2][j] + list[i-2][j-1];
			}
			list[i-1][i-1] = 1;
		}
		
		for(int i = 0;i<n;i++){
			for(int j = 0;j<=i;j++){
				System.out.printf(list[i][j] + " ");
			}
			System.out.println();
		}
	}
		
}

沒什麼難的東西,就是麻煩,計算的時候別把下標算錯就好。

 

 

特殊的數字:

問題描述
  153是一個非常特殊的數,它等於它的每位數字的立方和,即153=1*1*1+5*5*5+3*3*3。程式設計求所有滿足這種條件的三位十進位制數。
輸出格式
  按從小到大的順序輸出滿足條件的三位十進位制數,每個數佔一行。

題目很簡單,資料範圍為三位十進位制數,也就是說從100到999.需要做的就是判斷數字的每位數字的立方和是不是等於原數值而已,程式碼的核心點是怎樣把數字的每一位一個個取出來。記住一個蠢方法,如果除法解決不了,就用取餘。比如取出百位數字:num/100,取出個位數字num%10,十位數字就別想了,等於num - 百位數字x100 - 個位數字(如果非要想的話(num/10)%10 )。完,可以了,還有一種方法,先把數字當成字串來處理,將每個字元取出,然後再轉換成數字。這種方法用python很好實現,java也並不難,可以嘗試下。

示例程式碼:

import java.util.*;

public class Main {
	public static void main(String args[]){
		int a,b,c;
		for(int i = 100;i<1000;i++){
			a = i/100;
			b = (i/10)%10;
			c = i%10;
			if(a*a*a+b*b*b+c*c*c == i){
				System.out.println(i);
			}
		}
	
	
	}
}

 

迴文數:

問題描述
  1221是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的,程式設計求所有這樣的四位十進位制數。
輸出格式
  按從小到大的順序輸出滿足條件的四位十進位制數。

這個問題一開始會怎樣考慮,還是把數字一個個取出來嗎,但是此問題我們需要做的是將數字倒過來,其實並沒有什麼邏輯上的計算,因此,考慮上道題我說的那個方法,把數字當成字串,將字串倒置,來比較倒置前後是否相同,相同就輸出。

字串的倒置有方法嗎?有,需要箇中介StringBuilder(),StringBuilder的reverse方法可以將引數倒置,他的toString方法可以把StringBuilder物件轉回String。那就很簡單了:

public class Main {
	public static void main(String args[]){
		String s;
		for(int i = 1000;i<10000;i++){
			s = ""+i;
			if(new StringBuilder(s).reverse().toString().equals(s)){
				System.out.println(i);
			}
		}
	
	}
}

 

ok,寫完了吧。

java筆記只寫一點:

1、將字串s倒置:new StringBuilder(s).reverse().toString()