本文章會講解部分題解(因為有的題不會!!,太菜了),如果大家發現解答有問題,可以留言,大家一起討論,
試題A:
答案:624
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 1;
int count = 0;
while (true) {
String b = a + "";
for (int i = 0; i < b.length(); i++) {
if (b.charAt(i) == '2') {
count++;
}
}
a++;
if (a == 2021) {
System.out.println(count);
return;
}
}
}
第一題相對簡單,直接從1到2020遍歷,判斷有多少個2即可,
試題B:
答案:16520
public static void main(String[] args) {
int l = 1000;
String arr[] = new String[300];
int arr2[][] = new int[300][300];
Scanner s = new Scanner(System.in);
int count = 0; // 計算多少個2020
String target = "2020";
String b = "";
for (int i = 0; i < 300; i++) {
arr[i] = s.next();
}
// 將輸入的字串轉換成陣列
for (int i = 0; i < arr.length; i++) {
for (int z = 0; z < arr[i].length(); z++) {
arr2[i][z] = (arr[i].charAt(z) - '0');
}
}
// 判斷上下左右斜對角的方法
for (int i = 0; i < arr2.length; i++) {
for (int j = 0; j < arr2[i].length; j++) {
if (arr2[i][j] == 2) {
b = "";
// 左 -》右
// if (j + 4 <= arr2[i].length) {
// for (int k = j; k < j + 4; k++) {
// b = b + arr2[i][k];
// }
// if (b.equals(target)) {
// count++;
// b = "";
// }
// }
// 上 -》下
// if (i + 4 <= arr2[i].length) {
// for (int k = i; k < i + 4; k++) {
// b = b + arr2[k][j];
// }
// if (b.equals(target)) {
// count++;
// b = "";
// }
// }
左上 - > 右下
if (i + 4 <= arr2[i].length && j + 4 <= arr2[i].length) {
int n = i;
int m = j;
for (int k = 0; k < 4; k++) {
b = b + arr2[n][m];
n++;
m++;
}
if (b.equals(target)) {
count++;
b = "";
}
}
}
}
}
System.out.println(count);
}
解題思路:首先,題目中說明了三種尋找的方式,必定需要拿出每一位字符進行判斷和拼接,來檢測是否滿足條件,但是如果你要拿出每一位字符,最好的辦法就是將輸入的值,將每一個字符存入一個二維陣列,這樣就能方便后續的計算,首先, 你需要知道輸入的值需要存入一個一維的字串陣列,每一行就看作一個字串存入陣列中,然后將這個一維的字串陣列轉成二維的陣列,將陣列中的每一個字符存入陣列,接著開始遍歷二維陣列,如果取出的當前字符為2,則就需要判斷這個字符從左到右,從上到下,從左上到右下是不是滿足要求,如果滿足要求則count++,這里需要注意的就是要防止陣列的越界,
我這里遇到一個問題,我用三個if來分別判斷左->右 ,上->下,左上-> 右下,但是如果我同時執行三個if的話,結果不準確,如果每次只執行一個if陳述句,結果就準確,現在也沒有找到原因,于是我執行了三次程式,分別計算出了左->右共5505個滿足條件的,從上->下有5509個滿足條件的,從左上->右下,共有5506個滿足條件的,所以結果為5505+5506+5509 = 16520.如果大家找出為什么三個if同時執行結果不同的原因,可以留言交流!!!
試題C:
答案: 761
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 1;
for (int i = 0; i < 20; i++) {
a = a + (i * 4);
System.out.println(a);
}
}
解題思路:先手寫幾行就可以發現,第一行第一列的值為1,第二行第二列的值為5.第三行第三列的值為13,第四行第四列的值為25,仔細觀察就可以發現第i行第i列的值為 a = a + (i*4),
試題F:
答案: jonmlkihgfedcba
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "jonmlkihgfedcba";
StringBuffer sb = new StringBuffer(a);
int i = 0;
int count = 0;
while (true) {
if (i < a.length() - 1 && a.charAt(i) > a.charAt((i + 1))) {
sb.replace(i, i + 1, a.charAt((i + 1)) + "");
sb.replace(i + 1, i + 2, a.charAt((i)) + "");
a = sb.toString();
count++;
continue;
} else if (i < a.length() - 1 && i - 1 >= 0 && a.charAt(i) < a.charAt((i - 1))) {
sb.replace(i - 1, i, a.charAt((i)) + "");
sb.replace(i, i + 1, a.charAt((i - 1)) + "");
a = sb.toString();
count++;
i--;
continue;
} else {
i++;
if (i == a.length() - 1) {
System.out.println(count);
System.out.println(a);
break;
}
}
}
if (count == 100) {
System.out.println(a);
return;
}
}
解題思路:首先根據題目所給交換規則,寫一個完整的程式,并且當交換完成之后,要輸出交換次數(count),和最后的結果(a),輸出這兩個值來判斷程序是否正確,例如:當a為lan時,輸出1 和aln;當a為waqs時,輸出3和aqsw,此時,就可以開始找長度最短,并且字典序最小的呢個字串了,題目中最后一句描述有錯,應該是字串中不能有重復的字符,當a=zyxw時,輸出的count值為6,此時你應該知道,當字串的長度為4時,最大的交換次數為6,因為最左邊的要移動到最右邊,最右邊的要移動到最左邊,所以首先根據這個找出滿足條件的字串長度,當a=zyxwvutsrqponm時,最大的交換次數為91,當a = zyxwvutsrqponml時,最大的交換次數為105,所以交換次數為100的字串的長度必定為15,而且還需要字典序最小,所以從a開始倒敘排列15個字符, a=onmlkjihgfedcba時,交換次數為105次,為了滿足交換次數恰好100次,將j向前移動5位即可,所以答案為jonmlkihgfedcba,
試題F:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int count = s.nextInt();
DecimalFormat df = new DecimalFormat(".00");
int arr[] = new int[count];
double num = 0;
for (int i = 0; i < arr.length; i++) {
arr[i] = s.nextInt();
num += arr[i];
}
Arrays.sort(arr);
System.out.println(arr[count - 1]);
System.out.println(arr[0]);
System.out.println(df.format(num / count));
}
這道題沒有什么技術含量,考的主要是基礎,感興趣的朋友可以將多種保留小數的方式測驗一下,
試題G:
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
int max = -1;
char maxs = 'a';
String a = s.next();
HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < a.length() - 1; i++) {
if (map.get(a.charAt(i) + "") != null) {
int num = (int) map.get(a.charAt(i) + "");
map.remove(a.charAt(i) + "");
num++;
map.put(a.charAt(i) + "", num);
} else {
map.put(a.charAt(i) + "", 1);
}
}
Object[] arr = map.entrySet().toArray();
for (int i = 0; i < arr.length; i++) {
String arr2[] = (arr[i] + "").split("=");
if ((Integer.parseInt(arr2[1])) >= max) {
if ((Integer.parseInt(arr2[1])) == max) {
if (arr2[0].charAt(0) > maxs) {
maxs = arr2[0].charAt(0);
continue;
}
}
max = (Integer.parseInt(arr2[1]));
maxs = arr2[0].charAt(0);
}
}
System.out.println(maxs);
System.out.println(max);
}
解題思路:使用map集合對每個字符出現的次數進行保存,最后將結果轉成陣列進行遍歷,找出出現最多的字符,
試題I:
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
String a = s.next();
HashMap<String, Integer> map = new HashMap<>();
int count = 0;
for (int i = 0; i < a.length(); i++) {
for (int j = i + 1; j <= a.length(); j++) {
String b = a.substring(i, j);
map.clear();
for (int k = 0; k < b.length(); k++) {
if (map.get(b.charAt(k) + "") == null) {
map.put(b.charAt(k) + "", 1);
}
}
count += map.size();
}
}
System.out.println(count);
}
解題思路:首先利用雙指標對字串進行截取,截取之后逐個取出字串的每個字串存入map集合,如果map集合中沒有此字串則放入map集合中,最后獲取size,其實這里可以利用set本身去重的特點,來替換map集合,
以上就是我寫出的答案,部分題還沒有寫出完整的答案,后續會不斷的修改本文章,不斷的將解題補充完整,如果以上答案有什么不對或者可以優化的地方,歡迎大家指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/182962.html
標籤:其他
上一篇:約瑟夫環問題(Joseph)
