華為 2016實習生 上機考試 題目
阿新 • • 發佈:2019-01-26
昨天剛參加上機考試,在兩個小時的考試時間內有的牛人30分鐘就完成考試。題目貌似比較簡單,不過呵呵,我就來當攢經驗了。下面的參考答案有錯誤的地方還望指正,或者有更好的演算法也請大家多多分享。
考試用程式設計工具VS2005及JDK1.7,考試型別涉及陣列、連結串列、指標、字串、迴圈、列舉、排序等等。考試語言C/C++或JAVA。
第一題:字串去掉重複的字元(100分)
描述: 執行時間限制 記憶體限制: |
濾除輸入字串中的重複出現的字元,只保留第一個 10 Sec 無限制 |
輸入: | 字串,長度小於1000 |
輸出: |
字串 |
樣例輸入: | 12222aab2 |
樣例輸出: |
12ab |
利用正則表示式去重import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner input = new Scanner(System.in); String text = input.nextLine(); System.out.print(filter(text)); input.close(); } public static String filter(String s){ String result = " "; int len = s.length(); if(len<1000) { char[] ch = s.toCharArray(); for (int i = 0; i < len; i++) { char temp = ch[i]; boolean repeat = false; for (int j = 0; j < result.length(); j++) { if (temp == result.charAt(j)) repeat = true; } if(!repeat){ result += temp; } } }else result = "The string is too long!!!"; return result.trim(); } }
利用LinkedHashSet的不包含重複元素以及對保留元素插入順序的特性,過濾重複字串import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner input = new Scanner(System.in); String text = input.nextLine(); System.out.print(filter(text)); input.close(); } public static String filter(String s){ String result = ""; int len = s.length(); if(len<1000) { /* 正則項解釋:(?s)開啟單行模式 DOTALL,讓.號匹配任意字元 (.) 任意字元 並捕獲在第一組 (?=.*\1) 這是斷言, 表示後面內容將是 任意個字元加上第一組所捕獲的內容 這樣子,如果這整個式子匹配到,表示第一個捕獲組內容在字串中至少出現兩次,替換為 "" 空串 如“12222aab12”最後為“ab12”,即保留後出現的字元 因此需要對字串在過濾前反轉,過濾後再反轉回來。 */ result = new StringBuilder(s).reverse().toString(); result = result.replaceAll("(?s)(.)(?=.*\\1)", ""); result = new StringBuilder(result).reverse().toString(); }else result = "The string is too long!!!"; return result; } }
import java.util.LinkedHashSet;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String text = input.nextLine();
System.out.print(filter(text)); input.close();
}
public static String filter(String s){
String result = "";
LinkedHashSet<String> temp = new LinkedHashSet<String>();
int len = s.length();
if(len<1000) {
for(int i=0;i<s.length();i++){
temp.add(""+s.charAt(i));
}
for(String ch :temp){
result += ch;
}
}else
result = "The string is too long!!!";
return result;
}
}
第二題:簡單的均值濾波演算法(200分)
描述: 執行時間限制 記憶體限制: |
計算機在對模擬訊號進行資料採集時,經常會收到干擾,導致讀取的資料發生突變,這時就需要對採集的資料做特殊處理,保證資料是可靠的,該題目模擬對電池電壓的資料採集,限定條件如下: 1)電池電壓的有效範圍為【3300-4200】,包括3300和4200,無效值在計算時要丟棄。 2)輸入為10 組電池電壓,包括有效值和無效值,每五組有效值去一次平均值,作為最終輸出值,有效值不夠五組不輸出; 3)輸出格式:“有效電壓組數 平均值1 平均值2”,平均值有幾組輸出幾組,沒有的話不輸出,“有效電壓組數”必須輸出; 4)計算直接採用整形數值即可,不考慮浮點數; 5)除最終輸出外,中間不要有任何的I/O資料輸出; 無限制 無限制 |
輸入: | 10組電壓值,為整形資料 |
輸出: | 輸出格式:“有效電壓組數 平均值1 平均值2”,平均值有幾組輸出幾組,沒有的話不輸出,“有效電壓組數”必須輸出 |
樣例輸入: | 3500 3500 3400 3500 3600 4100 4100 4100 4100 4100 |
樣例輸出: | 2 3500 4100 |
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[] voltage = new int[10];
int num = 0;
while(input.hasNext()){
int temp = input.nextInt();
voltage[num] = temp;
num++;
if(num>9)break;
}
input.close();
int[] validVoltage = new int[10];
int num1 =0;
for(int i=0;i<voltage.length;i++){
if(voltage[i]>3299 && voltage[i]<4201){
validVoltage[num1] = voltage[i];
num1++;
}
}
if(num1<4){
System.out.print("0");
}else if (num1<9){
int sum = 0;
for (int i=0;i<5;i++){
sum += validVoltage[i];
}
System.out.print("1 "+ sum/5);
}else{
int sum1 = 0,sum2 = 0;
for (int i=0;i<5;i++){
sum1 += validVoltage[i];
}
for (int i=5;i<10;i++){
sum2 += validVoltage[i];
}
System.out.print("2 "+sum1/5+" "+sum2/5);
}
}
}
第三題:大數求餘(300分)
描述: 執行時間限制 記憶體限制: |
輸入兩個超長整型構成的字串,其間使用一個空格分隔,每個字串最大長度為100個字元。求第一個整數除以第二個整數以後的餘數 無限制 無限制 |
輸入: | 輸入兩個以空格分隔的字串,輸入的每個字串的最大長度是100個字元。 |
輸出: |
輸出為兩個字串相除以後的餘數。如果異常,輸出null。 |
樣例輸入: | 123456789 23456789 |
樣例輸出: |
6172844 |
參考答案:
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
BigInteger bi1 = input.nextBigInteger();
BigInteger bi2 = input.nextBigInteger();
BigInteger bi3 ;
bi3 = bi1.remainder(bi2);
System.out.print(bi3);
}catch (Exception ex){
System.out.print("null");
}
input.close();
}
}
當然此題的本意肯定不會這麼簡單,另外解法:
原理:利用被除數減去除數,直到剩餘的資料小於被除數,此時的結果就是餘數。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try{
String s1 = input.next();
String s2 = input.next();
int n1 = s1.length();
int n2 = s2.length();
//將大數存為陣列
int[] int1=new int[n1];
for(int i=n1-1,k=0;i>=0&&k<n1;i--,k++){ //被除數,個位數的下標為0
int1[i]=Integer.parseInt(s1.substring(k,k+1));
}
int[] int2=new int[n2];//除數
for(int i=n2-1,k=0;i>=0&&k<n2;i--,k++){
int2[i]=Integer.parseInt(s2.substring(k,k+1));
}
int[] int3=new int[n1];//存放餘數
if(!isdelable(int1, int2)){//判斷是否可以被除
System.out.print(s1);
}else{
int3=delete(int1, int2);
while(isdelable(int3, int2)){
//delete(s3,s2);
int3=delete(int3, int2);
}
if(int3.length==0){
System.out.println(0);
}else{
for(int i=int3.length-1;i>=0;i--){
System.out.print(int3[i]);
}
}
}
input.close();
}catch(Exception ex){
System.out.println("null");
ex.printStackTrace();
}
}
//delete函式用來實現兩個僅包含數字的字串相減
static int[] delete(int[] int1,int[] int2){
int n1=int1.length;
int n2=int2.length;
int[] int3=new int[n1];//與被除數長度相等
for(int i=0;i<n2;i++){//將除數對被除數對齊
int3[i]=int2[i];
}
for(int i=0;i<n1;i++){
if(int1[i]>=int3[i]){
int1[i]=int1[i]-int3[i];
}else{
int1[i]=int1[i]+10-int3[i];
int1[i+1]--;
}
}
int k=0;//統計減後被除數高位為空的個數
for(int i=n1-1;i>=0;i--){
if(int1[i]==0){
k++;
}else
break;
}
int[] int4=new int[n1-k];
for(int i=n1-k-1;i>=0;i--){
int4[i]=int1[i];
}
return int4;
}
//isdelable用來判斷是否仍然可以繼續執行減法
static boolean isdelable(int[] int1,int[] int2){
boolean b=false;
int n1=int1.length;
int n2=int2.length;
if(n1<n2){ //被除數小於除數
b=false;
}else if(n1==n2){//除數與被除數長度相等,如果被除數大則返回true,否則false
int i=n1-1;
while(i>0&&int1[i]==int2[i]){
i--;
}
if(int1[i]<int2[i]){
b=false;
}else{
b=true;
}
}else{//被除數長度大於除數
b=true;
}
return b;
}
}