《面試程式設計題真題合集(三)——華為2019校園招聘真題題解》
面試題一:獲取最長對稱串的長度
題目描述:
輸入一個字串,輸出該字串中對稱的子字串的最大長度,比如輸入字串“12213”,由於該
字串裡最長的對稱子字串是“1221”,因此輸出為4.
輸入描述:
連續的字串,字串長度不超過64,只包含數字和字母
輸出描述:
最長的對稱字串長度
示例1:
輸入
12321abc
輸出
5
import java.util.Scanner; public class Main { /** * 華為2019春招面試程式設計題:獲取最長的對稱字串長度 * @param str * @return */ public static int GetlongestSymStr(String str){ int n=str.length(); boolean[][] dp=new boolean[n][n]; int maxLen=0; for(int i=0;i<n;i++){ for(int j=i;j>=0;j--){ if(str.charAt(i)==str.charAt(j) && (i-j<2 || dp[j+1][i-1]==true)){ dp[j][i]=true; maxLen=Math.max(maxLen, i-j+1); } } } return maxLen; } public static void main(String[] args){ Scanner sc = new Scanner(System.in); String s = sc.nextLine(); System.out.println(GetlongestSymStr(s)); } }
面試題二:IPV6地址分類
題目描述:
ipv6地址為128位,完整的文字格式寫成8段16位的形式,例如:
2001:1002:FFFF:ABCD:1234:1234:0000:0001
簡寫時,會將其中全0的欄位壓縮,例如:
2001:0000:0000:0000:0000:0000:0000:0001會簡寫成2001::0001
0000:0000:0000:0000:0000:0000:0000:0001會簡寫成::0001或者::1
ipv6地址包括以下型別:
地址型別地址字首(二進位制)ipv6字首標識
單播地址未指定地址00....0(128 bits)::/128
環回地址00...1(128 bits)::1/128
鏈路地址1111111010FE80::/10
站點本地地址1111111011FEC0::/10
全球單播地址其他形式
組播地址11111111FF00::/8
任播地址從單播地址空間進行分配,使用單播地址的格式
輸入描述:
一行字串,完整形式的IPV6地址
輸出描述:
輸出一個字串,表示是何種型別的IPV6地址,輸出可以是:
Unspecified未指定地址
Loopback環回地址
LinkLocal鏈路本地地址
SiteLocal站點本地地址
GlobalUnicast全球單播地址
Multicast組播地址
Error錯誤的地址,或者非完整形式IPV6地址的字串
示例1:
輸入:
FE81:0001:0000:0000:FF01:0203:0405:0607
輸出:
LinkLocal
(程式碼帶更新)
面試題目三:應用下載順序
題目描述:
華為應用市場舉辦安裝應用獎勵金幣活動,不同的應用下載、試玩需要的流量大小不同,獎勵的金幣數量也不同,同一個應用多次下載只獎勵一次金幣,小花月末有一定的餘量,計算下載哪些應用可以獲取的金幣最多?相同金幣情況下,優先排名靠前的應用
輸入描述:
輸入分三行
第一行:流量數,單位MB,整數
第二行:應用排名順序,下載、試玩需要流量數,單位MB,整數
第三行:應用獎勵的金幣數
輸出描述:
輸出應用列表:建議下載的應用順序號,用一個空格分隔
示例1:
輸入
40
12 13 23 36
11 11 20 30
輸出:
1 3
說明:
注意輸出:開頭、末尾沒有空格
思路分析:
本題實際是一個01揹包模型,具體分析參考我的另一篇有關揹包問題的文章。
import java.util.Scanner;
public class Main{
/**
* 華為2019春招面試程式設計題:應用下載順序
* @param numOfLL 剩餘流量數
* @param needLL 下載應用排名及消耗流量數
* @param reword 下載獎勵金幣數
* @return
*/
public static String SequenceOfDownload(int numOfLL,int[] needLL,int[] reword){
return ZeroOnePack(numOfLL,needLL.length,needLL,reword);
}
/**
* @param V 揹包容量
* @param N 物品種類
* @param weight 物品重量
* @param value 物品價值
* @return
*/
public static String ZeroOnePack(int V,int N,int[] weight,int[] value){
//初始化動態規劃陣列
int[][] dp = new int[N+1][V+1];
//為了便於理解,將dp[i][0]和dp[0][j]均置為0,從1開始計算
for(int i=1;i<N+1;i++){
for(int j=1;j<V+1;j++){
//如果第i件物品的重量大於揹包容量j,則不裝入揹包
//由於weight和value陣列下標都是從0開始,故注意第i個物品的重量為weight[i-1],價值為value[i-1]
if(weight[i-1] > j)
dp[i][j] = dp[i-1][j];
else
dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weight[i-1]]+value[i-1]);
}
}
//則容量為V的揹包能夠裝入物品的最大值為
int maxValue = dp[N][V];
//逆推找出裝入揹包的所有商品的編號
int j=V;
String numStr="";
for(int i=N;i>0;i--){
//若果dp[i][j]>dp[i-1][j],這說明第i件物品是放入揹包的
if(dp[i][j]>dp[i-1][j]){
numStr = i+" "+numStr;
j=j-weight[i-1];
}
if(j==0)
break;
}
return numStr;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int numOfLL = Integer.parseInt(sc.nextLine());
String str2 = sc.nextLine();
String str3 = sc.nextLine();
String[] needLL;
String[] reword;
needLL= str2.split(" ");
reword = str3.split(" ");
int[] Reword = new int[needLL.length];
int[] NeedLL = new int[reword.length];
for(int i=0;i<needLL.length;i++){
NeedLL[i] = Integer.parseInt(needLL[i]);
Reword[i] = Integer.parseInt(reword[i]);
}
String result = SequenceOfDownload(numOfLL,NeedLL,Reword);
result = result.substring(0,result.length()-1);
System.out.println(result);
sc.close();
}
}