华为硬件⼯程师社招机考题库_题库华为研发⼯程师编程题型
介绍汇总合集
题⽬1:⼀个农夫养了⼀批怪⽜,⼀对⽜每⽉繁殖⼀对⼩⽜,⼩⽜出⽣后三个⽉时间来⽣长,第四个⽉来繁殖。 输⼊⽜的组数 n, 然后在输⼊ n 组,每组由两⾏组成:第⼀⾏是⽜的对数,第⼆⾏是需要的成长时间;如此依次输⼊ n 组。
1 #include
2 #include
3 using namespace std;
4
5 int cow(int month_num)
6 {
7    if (month_num<=4)
8        return month_num+1;
9    else
10        return cow(month_num-1)+cow(month_num-4);
11 }
12 int main()
13 {
14    int num,num_cow,month_num=0;
15    vector<int> num_sr;
16    vector<int>::iterator it;
17
18    cin>>num;
19    for(int i=1;i<=2*num;++i)
20    {
21        cin>>num_cow;
22        num_sr.push_back(num_cow);
23    }
24    for(it=num_sr.begin();it<=d()-2;)
25    {
26        //cout<
27        int num_total=cow(*(++it));
28        //cout<
29        //注意此处,上⾯的++it对迭代器进⾏了+1操作,it此时已经指向了it+1
30        cout<endl;
31        it=it+2;
32    }
33    while(1);
34 }
题⽬2:输⼊⼀个字符串,输出该字符串中对称的⼦字符串的最⼤长度,⽐如输⼊字符串 “12213”,由于该字符串⾥最长的对称⼦字符串是 “1221”,因此输出为 4。 输⼊描述: 连续的字符串,字符串长度不超过 64,只包含数字和字母 输出描述: 最长的对称字符串长度
输⼊⽰例: 12321abc 输出⽰例: 5
import java.util.Scanner;
public class Main {
public static int GetlongestSymStr(String str){
int n=str.length();
boolean[][] dp=new boolean[n][n];
int maxLen=0;
for(int i=0;i
for(int j=i;j>=0;j--){
if(str.charAt(i)==str.charAt(j) && (i-j<2 || dp[j+1][i-1]==true)){index复数
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));
}
}
题⽬3:华为应⽤市场举办安装应⽤奖励⾦币活动,不同的应⽤下载、试玩需要的流量⼤⼩不同,奖励的⾦币数量也不同,同⼀个应⽤多次下载只奖励⼀次⾦币,⼩花⽉末有⼀定的余量,计算下载哪些应⽤可以获取的⾦币最多?相同⾦币情况下,优先排名靠前的应⽤。 输⼊描述: 输⼊分三⾏ 第⼀⾏:流量数,单位 MB, 整数 第⼆⾏:应⽤排名顺序,下载、试玩需要流量数,单位 MB, 整数 第三⾏:应
⽤奖励的⾦币数 输出描述: 输出应⽤列表:建议下载的应⽤顺序号,⽤⼀个空格分隔 输⼊⽰例: 40 12 13 23 36 11 11 20 30 输出⽰例: 1 3说明:注意输出:开头、末尾没有空格
import java.util.Scanner;
public class Main{
/**
* @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;i1;i++){
for(int j=1;j1;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]){
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.Line());
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[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();
}
}
题⽬4:输⼊⼀个链表的头结点,从尾到头反过来输出每个结点的值。 链表结点定义如下: struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};先翻转链表,再按顺序打印(主要是想⾃⼰实现单链表的翻转,这种实现⽅式破坏了链表的结构,当然再翻转⼀下就还原了) 翻转链表的步骤: 1:将当前节点的next节点指向他以前的前⼀个节点 2:当前节点下移⼀位 3:如果是最后⼀个节点,就把它的next节点指向它以前的前⼀个节点,并推出循环。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。