由于和老師報名參加本次藍橋杯算法比賽,想要在本次比賽中沖刺較好的成績,且友善自己的複習,于是決定記錄下自己的練習日常,預計每天練習2題,遇見難度較高的題目的話,就隻會更記錄一題。
1、數列排序
問題描述
問題描述
給定一個長度為n的數列,将這個數列按從小到大的順序排列。1<=n<=200
輸入格式
第一行為一個整數n。
第二行包含n個整數,為待排序的數,每個整數的絕對值小于10000。
輸出格式
輸出一行,按從小到大的順序輸出排序後的數列。
樣例輸入
5
8 3 6 4 9
樣例輸出
3 4 6 8 9
思路:本題的思路很簡單,先将輸入進行合并到數組,然後對數組進行排序。
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
int[] arr = new int[205];
n = scanner.nextInt();
for(int i = 0 ; i < n ; i++)
arr[i] = scanner.nextInt();
sort(arr,n);
for(int i = 0 ; i < n ; i++)
System.out.print(arr[i] + " ");
}
private static void sort(int[] arr,int n) {
for(int i = 0; i < n - 1 ;i++)
{
for(int j = 0 ; j < n - 1 - i ; j++)
if(arr[j] > arr[j + 1])
{
int t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
}
}
}
2、 十六進制轉八進制
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字元串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先将十六進制數轉換成某進制數,再由某進制數轉換成八進制。
思路:本題我的思路是先将16進制轉換為2進制,并将2進制字元串長度轉換為3的倍數,在轉換為8進制,最後将8進制首位的0去掉。
import java.util.Scanner;
class Main {
public static void main(String[] args) {
int n;
Scanner scanner = new Scanner(System.in);
n=scanner.nextInt();
String[] a= new String[n];
for(int i=0;i<n;i++){
a[i]=scanner.next();//接受使用者輸入
}
for(int i=0;i<n;i++) {
change(a[i]);
}
}
public static void change(String n) {
StringBuilder sBuffer = new StringBuilder();
StringBuilder m = new StringBuilder();
for(int i=0;i<n.length();i++){
switch (n.charAt(i)) {//截取十六進制數的每一個字元,并将其轉換為對應二進制數
case '0':sBuffer.append("0000");break;
case '1':sBuffer.append("0001");break;
case '2':sBuffer.append("0010");break;
case '3':sBuffer.append("0011");break;
case '4':sBuffer.append("0100");break;
case '5':sBuffer.append("0101");break;
case '6':sBuffer.append("0110");break;
case '7':sBuffer.append("0111");break;
case '8':sBuffer.append("1000");break;
case '9':sBuffer.append("1001");break;
case 'A':sBuffer.append("1010");break;
case 'B':sBuffer.append("1011");break;
case 'C':sBuffer.append("1100");break;
case 'D':sBuffer.append("1101");break;
case 'E':sBuffer.append("1110");break;
case 'F':sBuffer.append("1111");break;
default:
break;
}
}
while(sBuffer.length()%3!=0) {
sBuffer.insert(0, 0);
}
for(int i=0;i<sBuffer.length();i=i+3) {
switch(sBuffer.substring(i, i+3)){
case "000": m.append("0");break;
case "001": m.append("1");break;
case "010": m.append("2");break;
case "011": m.append("3");break;
case "100": m.append("4");break;
case "101": m.append("5");break;
case "110": m.append("6");break;
case "111": m.append("7");break;
default:
break;
}
}
if('0'==m.charAt(0)){
m.deleteCharAt(0);
System.out.println(m);
}else
System.out.println(m);
}
}
3、十六進制轉十進制
問題描述
從鍵盤輸入一個不超過8位的正的十六進制數字元串,将它轉換為正的十進制數後輸出。
注:十六進制數中的10~15分别用大寫的英文字母A、B、C、D、E、F表示。
樣例輸入
FFFF
樣例輸出
65535
思路:首先将輸入存儲,然後建構一個Character-Integer的Map集合(也可以用switch語句),然後進行運算,從第零位開始,用a存儲16的(m-i-1)次方,即為位數,然後相加,最後輸出;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long count=0;
String m=sc.next();
Map<Character,Integer> map=new HashMap<Character,Integer>();
map.put('0', 0);
map.put('1',1);
map.put('2',2);
map.put('3',3);
map.put('4',4);
map.put('5',5);
map.put('6',6);
map.put('7',7);
map.put('8',8);
map.put('9',9);
map.put('A',10);
map.put('B',11);
map.put('C',12);
map.put('D',13);
map.put('E',14);
map.put('F',15);
for(int i=0;i<m.length();i++) {
long a=(long) Math.pow(16, m.length()-i-1);
count=count+map.get(m.charAt(i))*a;
}
System.out.print(count);
}
}
4、十進制轉十六進制
問題描述
十六進制數是在程式設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符号,分别表示十進制數的0至15。十六進制的計數方法是滿16進1,是以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。
給出一個非負整數,将它表示成十六進制的形式。
輸入格式
輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出格式
輸出這個整數的16進制表示
樣例輸入
30
樣例輸出
1E
思路:同樣存儲一個map集合,然後一直除以16,并将餘數賦給str,最後翻轉輸出(貌似這樣做當輸入很大時會報錯,後期修改下)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
int i = 0;
char[] S = new char[100];
if(number == 0){
System.out.print(0);
}
else{
while(number!=0)
{
int t=number%16;
if(t >=0 && t<10)
{
S[i] = (char)(t+'0');
i++;
}
else
{
S[i] = (char)(t+'A'-10);
i++;
}
number=number/16;
}
for (int j=i-1;j>=0;j--)
{
System.out.print(S[j]);
}
}
}
}
5、特殊回文數
問題描述
123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。
輸入一個正整數n, 程式設計求所有這樣的五位和六位十進制數,滿足各位數字之和等于n 。
輸入格式
輸入一行,包含一個正整數n。
輸出格式
按從小到大的順序輸出滿足條件的整數,每個整數占一行。
樣例輸入
52
樣例輸出
899998
989989
998899
資料規模和約定
1<=n<=54。
思路:由題目可知,數字大小為5位或者6位,那麼依次周遊是否符合題目要求的條件,是則輸出!
package 入門訓練;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 十六進制轉10進制 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
int i = 0;
char[] S = new char[100];
if(number == 0){
System.out.print(0);
}
else{
while(number!=0)
{
int t=number%16;
if(t >=0 && t<10)
{
S[i] = (char)(t+'0');
i++;
}
else
{
S[i] = (char)(t+'A'-10);
i++;
}
number=number/16;
}
for (int j=i-1;j>=0;j--)
{
System.out.print(S[j]);
}
}
}
}
}
7、字母圖形
問題描述
利用字母可以組成一些美麗的圖形,下面給出了一個例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
這是一個5行7列的圖形,請找出這個圖形的規律,并輸出一個n行m列的圖形。
輸入格式
輸入一行,包含兩個整數n和m,分别表示你要輸出的圖形的行數的列數。
輸出格式
輸出n行,每個m個字元,為你的圖形。
樣例輸入
5 7
樣例輸出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
資料規模與約定
1 <= n, m <= 26。
思路:我最先的思路是将26個字母建立個字元串,然後取出m個字元,最後在按照規律去輸出,不過好像存在一些問題,數組越界,但這也是一直思想和自己思考,也列出來,第二種就是按照系統給的提示,絕對值來進行輸出!
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
String str=new String("ABCDFGHIJLMNOPQRSTUVWXYZ");
String s=str.substring(0,m);
System.out.println(s);
for(int i=2;i<=n;i++) {
String s1=s.substring(0,i);
StringBuilder s2=new StringBuilder(s1);
StringBuilder s3=s2.reverse();
String s4=s.substring(1,m-i+1);
s3.append(s4);
System.out.println(s3);
}
}
}
package 入門訓練;
import java.util.Scanner;
public class 字母圖形 {
public static void main(String[] args) {
char c[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int x = Math.abs(i-j);
System.out.print(c[x]);
}
System.out.println();
}
}
}