2017華為筆試題2
阿新 • • 發佈:2019-02-13
這是20170823這一場,整體來說還是比較簡單的。
一、寫一個轉換字串的函式
1.1 題目描述
將輸入字串中下標為偶數的字元連成一個新的字串輸出,需要注意兩點:
1. 如果輸入字串的長度超過20,則轉換失敗,返回“ERROR!”字串;
2. 輸入字串只能由0-9數字,小寫a-z和大寫A-Z組成,如果包含其他字元,則轉換失敗,返回“ERROR!”字串。
1.2 程式碼實現
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
if(string.length()>20){
System.out.print("ERROR!");
return;
}
char[] str = string.toCharArray();
char[] output = new char[(str.length+1)/2];
ConvertStr(str, output);
for (int i = 0; i < output.length; i++) {
System.out .print(output[i]);
}
}
public static void ConvertStr(char[] str,char[] output){
for(int i=0;i<str.length;i++){
if(!isValid(str[i])){
System.out.println("ERROR!");
}
if(i%2==0){
output[i/2] = str[i];
}
}
}
public static boolean isValid(char c){
Character character = c;
return (character.isAlphabetic(c)||character.isDigit(c));
}
二、給定一個正整數,給出消除重複數字以後最大的整數
2.1 題目描述
給定一個正整數,給出消除重複數字以後最大的整數,注意需要考慮長整數。
- 輸入示例:423234
- 輸出示例:432
2.2 程式碼實現
//第二題
public static void solve2(String s){
char[] a = new char[10];
StringBuilder sbBuilder = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
int index = s.charAt(i)-'0';
if(a[index]==0){
a[index] = 1;
sbBuilder.append(s.charAt(i));
}else if(a[index]==1){//如果這個數字已經存在,則取其中大的數儲存
StringBuilder string = new StringBuilder(sbBuilder.toString());
long m = Long.parseLong(string.toString());
int temp = string.indexOf(index+"");
string = string.deleteCharAt(temp);
string.append(s.charAt(i));
long n = Long.parseLong(string.toString());
//System.out.println("m:"+m+",n:"+n);
if(m<n){
sbBuilder = string;
}
}
}
System.out.print(sbBuilder.toString());
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
solve2(string);
}
三、實現2-62進位制任意兩種進位制之間的轉換
3.1 題目描述
將一個處於Integer型別聚會範圍內的整數從指定源進位制轉換成指定目標進位制;可指定的進位制值範圍為[2-62];每個數字的可聚會範圍為[0-9a-zA-Z];輸出字串的每一個都須為有效值,反例:”012”的百位字元為無效值,實現時無需考慮非法輸入。
- 輸入描述:源進位制 目標進位制 待轉換的整數值
- 輸入示例:8 16 12345670
- 輸出示例:29cbb8
3.2 題目分析
- 先將進位制值與字元值、字元值與進位制值之間的轉換函式寫好;
- 兩種進位制之間的轉換,一般是先將源進位制轉換成十進位制,然後再轉換成新進位制;
- 另外需要注意輸出是否為有效值。
3.3 程式碼實現
由於本人能力有限,寫出的程式碼只能通過65%,希望大家有全通過的程式碼,可以分享一下,大家共同進步。
public static int toInt(char c){//將字元值轉換成進位制值
int result = 0;
if(c>='0'&&c<='9'){
result = c-'0';
}else if(c>='a'&&c<='z'){
result = c-'a'+10;
}else if(c>='A'&&c<='Z'){
result = c-'A'+36;
}
return result;
}
public static char toChar(int i){//將進位制值轉換成字元值
int result = 0;
if(i<=9){
result = i+48;
}else if(i<=35){
result = i+87;
}else if(i<=61){
result = i+29;
}
return (char) result;
}
public static String toTen(String s,int o){//將原進位制轉換成十進位制
char[] array = s.toCharArray();
Long sum = 0l;
for (int i = 0; i < array.length; i++) {
//System.out.print(toInt(array[array.length-1-i])+" ");
sum = (long) (sum+(toInt(array[array.length-1-i]))*Math.pow(o, i));
}
String result = sum+"";
return result;
}
public static String toNew(String s,int n){//將十進位制轉換成新進位制
Long num = Long.parseLong(s);
StringBuilder sBuilder = new StringBuilder();
StringBuilder result = new StringBuilder();
while(num>0){
int temp = (int) (num%n);
sBuilder.append(toChar(temp));
num = num/n;
}
byte flag = 0;
for (int i = 0; i < sBuilder.length(); i++) {
if(flag==0&&sBuilder.charAt(sBuilder.length()-1-i)=='0'){
break;
}else{
flag=1;
result.append(sBuilder.charAt(sBuilder.length()-1-i));
}
}
return result.toString();
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int o = scanner.nextInt();
int n = scanner.nextInt();
String num = scanner.next();
String string = toTen(num, o);
//System.out.println(string);
string = toNew(string, n);
System.out.println(string);
}
提示:大家應該注意到題目中的Integer型別,需要考慮負整數的情況,之前就是因為沒有考慮負整數的,所以只通過65%。