我自己總結的Java學習的系統知識點以及面試問題,目前已經開源,會一直完善下去,歡迎建議和指導歡迎Star: github.com/Snailclimb/…
下面三道程式設計題來自網易2018校招程式設計題,這三道應該來說是非常簡單的程式設計題了,這些題目大家稍微有點程式設計和數學基礎的話應該沒什麼問題。看答案之前一定要自己先想一下如果是自己做的話會怎麼去做,然後再對照這我的答案看看,和你自己想的有什麼區別?那一種方法更好?
問題
一 獲得特定數量硬幣問題
小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。
魔法機器1:如果投入x個魔法幣,魔法機器會將其變為2x+1個魔法幣
魔法機器2:如果投入x個魔法幣,魔法機器會將其變為2x+2個魔法幣
小易採購魔法神器總共需要n個魔法幣,所以小易只能通過兩臺魔法機器產生恰好n個魔法幣,小易需要你幫他設計一個投入方案使他最後恰好擁有n個魔法幣。
輸入描述: 輸入包括一行,包括一個正整數n(1 ≤ n ≤ 10^9),表示小易需要的魔法幣數量。
輸出描述: 輸出一個字串,每個字元表示該次小易選取投入的魔法機器。其中只包含字元'1'和'2'。
輸入例子1: 10
輸出例子1: 122
二 求“相反數”問題
為了得到一個數的"相反數",我們將這個數的數字順序顛倒,然後再加上原先的數得到"相反數"。例如,為了得到1325的"相反數",首先我們將該數的數字順序顛倒,我們得到5231,之後再加上原先的數,我們得到5231+1325=6556.如果顛倒之後的數字有字首零,字首零將會被忽略。例如n = 100, 顛倒之後是1.
輸入描述: 輸入包括一個整數n,(1 ≤ n ≤ 10^5)
輸出描述: 輸出一個整數,表示n的相反數
輸入例子1: 1325
輸出例子1: 6556
三 字串碎片的平均長度
一個由小寫字母組成的字串可以看成一些同一字母的最大碎片組成的。例如,"aaabbaaac"是由下面碎片組成的:'aaa','bb','c'。牛牛現在給定一個字串,請你幫助計算這個字串的所有碎片的平均長度是多少。
輸入描述: 輸入包括一個字串s,字串s的長度length(1 ≤ length ≤ 50),s只含小寫字母('a'-'z')
輸出描述: 輸出一個整數,表示所有碎片的平均長度,四捨五入保留兩位小數。
如樣例所示: s = "aaabbaaac" 所有碎片的平均長度 = (3 + 2 + 3 + 1) / 4 = 2.25
輸入例子1: aaabbaaac
輸出例子1: 2.25
答案
一 獲得特定數量硬幣問題
分析:
作為該試卷的第一題,這道題應該只要思路正確就很簡單了。
解題關鍵:明確魔法機器1只能產生奇數,魔法機器2只能產生偶數即可。我們從後往前一步一步推回去即可。
示例程式碼
注意:由於使用者的輸入不確定性,一般是為了程式高可用性使需要將捕獲使用者輸入異常然後友好提示使用者輸入型別錯誤並重新輸入的。所以下面我給了兩個版本,這兩個版本都是正確的。這裡只是給大家演示如何捕獲輸入型別異常,後面的題目中我給的程式碼沒有異常處理的部分,參照下面兩個示例程式碼,應該很容易新增。(PS:企業面試中沒有明確就不用新增異常處理,當然你有的話也更好)
不帶輸入異常處理判斷的版本:
import java.util.Scanner;
public class Main2 {
// 解題關鍵:明確魔法機器1只能產生奇數,魔法機器2只能產生偶數即可。我們從後往前一步一步推回去即可。
public static void main(String[] args) {
System.out.println("請輸入要獲得的硬幣數量:");
Scanner scanner = new Scanner(System.in);
int coincount = scanner.nextInt();
StringBuilder sb = new StringBuilder();
while (coincount >= 1) {
// 偶數的情況
if (coincount % 2 == 0) {
coincount = (coincount - 2) / 2;
sb.append("2");
// 奇數的情況
} else {
coincount = (coincount - 1) / 2;
sb.append("1");
}
}
// 輸出反轉後的字串
System.out.println(sb.reverse());
}
}
複製程式碼
帶輸入異常處理判斷的版本(當輸入的不是整數的時候會提示重新輸入):
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
// 解題關鍵:明確魔法機器1只能產生奇數,魔法機器2只能產生偶數即可。我們從後往前一步一步推回去即可。
public static void main(String[] args) {
System.out.println("請輸入要獲得的硬幣數量:");
Scanner scanner = new Scanner(System.in);
boolean flag = true;
while (flag) {
try {
int coincount = scanner.nextInt();
StringBuilder sb = new StringBuilder();
while (coincount >= 1) {
// 偶數的情況
if (coincount % 2 == 0) {
coincount = (coincount - 2) / 2;
sb.append("2");
// 奇數的情況
} else {
coincount = (coincount - 1) / 2;
sb.append("1");
}
}
// 輸出反轉後的字串
System.out.println(sb.reverse());
flag=false;//程式結束
} catch (InputMismatchException e) {
System.out.println("輸入資料型別不匹配,請您重新輸入:");
scanner.nextLine();
continue;
}
}
}
}
複製程式碼
二 求“相反數”問題
分析:
解決本道題有幾種不同的方法,但是最快速的方法就是利用reverse()方法反轉字串然後再將字串轉換成int型別的整數,這個方法是快速解決本題關鍵。我們先來回顧一下下面兩個知識點:
1)String轉int;
在 Java 中要將 String 型別轉化為 int 型別時,需要使用 Integer 類中的 parseInt() 方法或者 valueOf() 方法進行轉換.
String str = "123";
int a = Integer.parseInt(str);
複製程式碼
或
String str = "123";
int a = Integer.valueOf(str).intValue();
複製程式碼
2)next()和nextLine()的區別
在Java中輸入字串有兩種方法,就是next()和nextLine().兩者的區別就是:nextLine()的輸入是碰到回車就終止輸入,而next()方法是碰到空格,回車,Tab鍵都會被視為終止符。所以next()不會得到帶空格的字串,而nextLine()可以得到帶空格的字串。
示例程式碼:
import java.util.Scanner;
/**
* 本題關鍵:①String轉int;②next()和nextLine()的區別
*/
public class Main {
public static void main(String[] args) {
System.out.println("請輸入一個整數:");
Scanner scanner = new Scanner(System.in);
String s=scanner.next();
//將字串轉換成數字
int number1=Integer.parseInt(s);
//將字串倒序後轉換成數字
//因為Integer.parseInt()的引數型別必須是字串所以必須加上toString()
int number2=Integer.parseInt(new StringBuilder(s).reverse().toString());
System.out.println(number1+number2);
}
}
複製程式碼
三 字串碎片的平均長度
分析:
這道題的意思也就是要求:(字串的總長度)/(相同字母團構成的字串的個數)。
這樣就很簡單了,就變成了字串的字元之間的比較。如果需要比較字串的字元的話,我們可以利用charAt(i)方法:取出特定位置的字元與後一個字元比較,或者利用toCharArray()方法將字串轉換成字元陣列採用同樣的方法做比較。
示例程式碼
利用charAt(i)方法:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.next();
//個數至少為一個
float count = 1;
for (int i = 0; i < s.length() - 1; i++) {
if (s.charAt(i) != s.charAt(i + 1)) {
count++;
}
}
System.out.println(s.length() / count);
}
}
}
複製程式碼
利用toCharArray()方法:
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.next();
//個數至少為一個
float count = 1;
char [] stringArr = s.toCharArray();
for (int i = 0; i < stringArr.length - 1; i++) {
if (stringArr[i] != stringArr[i + 1]) {
count++;
}
}
System.out.println(s.length() / count);
}
}
}
複製程式碼
如果你覺得我的文章對你有幫助話,歡迎關注我的微信公眾號:"Java面試通關手冊"(一個有溫度的微信公眾號,無廣告,單純技術分享,期待與你共同進步~~~堅持原創,分享美文,分享各種Java學習資源。)