2023年12月2日发(作者:皋庸)
华为机试题目笔记华为机试题目笔记2021-09-08更新:更新了抢票系统代码,但是感觉过分简单,希望不是我理解错误(审题错误也太low了,有其他看法的,请及时私信我,我好修正)服务器广播题目:服务器连接方式包括直接相连,间接连接。 A 和 B 直接连接, B 和 c 直接连接,则 A 和 c 间接连接。直接连接和间接连接都可以发送广播。给出一个 N * N 数组,代表 N 个服务器, matrix[i][j] == 1 ,则代表 i 和 j 直接连接;不等于 1 时,代表 i 和 j 不直接连接。matrix[i][i]== 1 ,即自己和自己直接连接。 matrix[i][j]==matrix[j][i] 。计算初始需要给几台服务器广播,才可以使侮个服务器都收到广播。输入描述: n * n 矩阵,[[1,1,0],[1,1,0],[0,0,1]]输出描述:整数2var broadcast = function(list) { const count=[];//
存储能够连接的广播列表 for(let i=0;i<;i++){ for(let j=i+1;j<;j++){ if(list[i][j]==1){ if(>0){ let flag = false; ((item,index)=>{ if(es(i)&&!es(j)){ count[index].push(j); }else if(es(j)&&!es(i)){ count[index].push(i); }else if(!es(i)&&!es(j)){ flag=true; } }) if(flag){ ([i,j]) } }else{ ([i,j]) } } } } for(let i=0;i<;i++){ let flag=false; (item=>{ if(es(i)){ flag=true } }) if(!flag){ ([i]) } } // count=[[0,1],[2]] return };(broadcast([[1,1,0],[1,1,0],[0,0,1]])) // 2航班预定统计题目:有 n 个航班,它们分别从 1 到 n 进行编号。我们这儿有一份航班预定表,表中第 i 条预定记录 bookings[i]= [i , j , k ]意味着我们在从 i 到 j的每个航班上预订了 k 个座位。请返回一个长度为 n 的数组answer ,按航班编号顺序返回每个航班上预订的座位数。输入描述: 前几行为航班预定信息,最后一行为航班数量.[[1 , 2 , 10], [2 , 3 , 20],[2 , 5 , 25]]5输出描述:长度为n的数组[10,55,45,25,25]var corpFlightBookings = function(bookings, n) { const count = new Array(n).fill(0); (item=>{ count[item[0]-1]+=item[2]; if(item[1]
输出描述:整数.2我理解起来这是个比较简单的问题:比较一组数,返回其中最小数的数量(不知道理解的对不对)function getTicket (arr) { //
传入时间组为空时,直接返回 if(===0){ return 0 } let index = 1; //
循环下标 let time = arr[0]; //
默认第一个时间为最早时间 let num = 1; //
默认至少有一个人能抢到票 while(index<){ //
将时间转化为时间戳便于比较 let t = new Date(time).getTime() - new Date(arr[index]).getTime(); ('t',t) time = t > 0 ? arr[index] : time; //
时间差>0,替换最早时间 num = t === 0 ? num+1 : 1; //
时间差===0,存在相同最高时间,可抢到票人数+1 index++; } return num}let data = [ '2021-01-11 12:12:12.001', '2021-01-11 12:12:12.002', '2021-01-11 12:12:12.101', '2021-01-11 12:12:12.011', '2021-01-11 12:12:12.001' ];(getTicket(data))报数游戏题目:有 n (1 数组下标 let index=0;// 报数记录 let total=n;// 已退出游戏人数 while(count 反转排序 for(let i=0;i<;i++){ if(str[i+1]!==undefined){ if(str[i+1].indexOf(str[i])!==0){ newStr+=`#${str[i]}` } }else{ newStr+=`#${str[i]}` } } return ;}(minimumLengthEncoding(['time','me','bell']))分子弹/分发糖果题目:老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示例 2:输入: [1,2,2]输出: 4解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这已满足上述两个条件。var candy = function(ratings) { let arr=new Array().fill(1); for(let i=1;i<;i++){ if(ratings[i]>ratings[i-1]){ arr[i]=arr[i-1]+1; } } for(let j=-2;j>=0;j--){ if(ratings[j]>ratings[j+1]&&arr[j]<=arr[j+1]){ arr[j]=arr[j+1]+1; } } let total=0; for(let i=0;i<;i++){ total+=arr[i] } return total};()candy([1,0,1])打印任务排序题目:某个打印机根据打印队列执行打印任务。打印任务分为九个优先级,分别采用数字1~9表示,数字越大优先级越高。打印机每次从队列头部取出第一个任务A,然后检查队列余下任务中有没有比A优先级更高的任务,如果有比A优先级高的任务,则将任务A放到队列尾部,否则执行任务A的打印。请编写一个程序,根据输入的打印队列,输出实际打印顺序var print = function(ratings) { let arr=new Array().fill(0); let index=1; while((...ratings)>0){ arr[f((...ratings))]=index; index++; ratings[f((...ratings))]=0; } return arr};// [1,5,3,4,2] 感觉过分简单,可能是我理解错误?(print([3,1,2,2,3]))集五福题目:以0和1组成的长度为5的字符串代表每个人所得到的福卡,每一位代表一种福卡,1表示已经获得该福卡,单类型福卡不超过1张,随机抽取一个小于10人团队,求该团队最多可以集齐多少套五福?输入描述:数组,即团队每个人的福卡拥有状态,输出描述:数字,即最多可以集齐的数量var print = function(ratings) { let arr=new Array(5).fill(0); for(let i=0;i<;i++){ for(let j=0;j<5;j++){ arr[j]+=parseInt(ratings[i][j]) } } return (...arr)};// 1,arr=[ 4, 1, 4, 4, 3 ](print(['10011','10110','01111','10111','10000','00100']))双列表元素分配题目:有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。var getMinusArray = function(a,b) { let suma=0; let sumb=0; for(let i=0;i<;i++){ suma+=a[i]; sumb+=b[i]; } let min=(suma-sumb); for(let i=0;i<;i++){ for(let j=0;j<;j++){ let temp=0; if((2*(b[j]-a[i])+suma-sumb) 2023年12月2日发(作者:皋庸) 华为机试题目笔记华为机试题目笔记2021-09-08更新:更新了抢票系统代码,但是感觉过分简单,希望不是我理解错误(审题错误也太low了,有其他看法的,请及时私信我,我好修正)服务器广播题目:服务器连接方式包括直接相连,间接连接。 A 和 B 直接连接, B 和 c 直接连接,则 A 和 c 间接连接。直接连接和间接连接都可以发送广播。给出一个 N * N 数组,代表 N 个服务器, matrix[i][j] == 1 ,则代表 i 和 j 直接连接;不等于 1 时,代表 i 和 j 不直接连接。matrix[i][i]== 1 ,即自己和自己直接连接。 matrix[i][j]==matrix[j][i] 。计算初始需要给几台服务器广播,才可以使侮个服务器都收到广播。输入描述: n * n 矩阵,[[1,1,0],[1,1,0],[0,0,1]]输出描述:整数2var broadcast = function(list) { const count=[];// 存储能够连接的广播列表 for(let i=0;i<;i++){ for(let j=i+1;j<;j++){ if(list[i][j]==1){ if(>0){ let flag = false; ((item,index)=>{ if(es(i)&&!es(j)){ count[index].push(j); }else if(es(j)&&!es(i)){ count[index].push(i); }else if(!es(i)&&!es(j)){ flag=true; } }) if(flag){ ([i,j]) } }else{ ([i,j]) } } } } for(let i=0;i<;i++){ let flag=false; (item=>{ if(es(i)){ flag=true } }) if(!flag){ ([i]) } } // count=[[0,1],[2]] return };(broadcast([[1,1,0],[1,1,0],[0,0,1]])) // 2航班预定统计题目:有 n 个航班,它们分别从 1 到 n 进行编号。我们这儿有一份航班预定表,表中第 i 条预定记录 bookings[i]= [i , j , k ]意味着我们在从 i 到 j的每个航班上预订了 k 个座位。请返回一个长度为 n 的数组answer ,按航班编号顺序返回每个航班上预订的座位数。输入描述: 前几行为航班预定信息,最后一行为航班数量.[[1 , 2 , 10], [2 , 3 , 20],[2 , 5 , 25]]5输出描述:长度为n的数组[10,55,45,25,25]var corpFlightBookings = function(bookings, n) { const count = new Array(n).fill(0); (item=>{ count[item[0]-1]+=item[2]; if(item[1] 输出描述:整数.2我理解起来这是个比较简单的问题:比较一组数,返回其中最小数的数量(不知道理解的对不对)function getTicket (arr) { // 传入时间组为空时,直接返回 if(===0){ return 0 } let index = 1; // 循环下标 let time = arr[0]; // 默认第一个时间为最早时间 let num = 1; // 默认至少有一个人能抢到票 while(index<){ // 将时间转化为时间戳便于比较 let t = new Date(time).getTime() - new Date(arr[index]).getTime(); ('t',t) time = t > 0 ? arr[index] : time; // 时间差>0,替换最早时间 num = t === 0 ? num+1 : 1; // 时间差===0,存在相同最高时间,可抢到票人数+1 index++; } return num}let data = [ '2021-01-11 12:12:12.001', '2021-01-11 12:12:12.002', '2021-01-11 12:12:12.101', '2021-01-11 12:12:12.011', '2021-01-11 12:12:12.001' ];(getTicket(data))报数游戏题目:有 n (1 数组下标 let index=0;// 报数记录 let total=n;// 已退出游戏人数 while(count 反转排序 for(let i=0;i<;i++){ if(str[i+1]!==undefined){ if(str[i+1].indexOf(str[i])!==0){ newStr+=`#${str[i]}` } }else{ newStr+=`#${str[i]}` } } return ;}(minimumLengthEncoding(['time','me','bell']))分子弹/分发糖果题目:老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示例 2:输入: [1,2,2]输出: 4解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这已满足上述两个条件。var candy = function(ratings) { let arr=new Array().fill(1); for(let i=1;i<;i++){ if(ratings[i]>ratings[i-1]){ arr[i]=arr[i-1]+1; } } for(let j=-2;j>=0;j--){ if(ratings[j]>ratings[j+1]&&arr[j]<=arr[j+1]){ arr[j]=arr[j+1]+1; } } let total=0; for(let i=0;i<;i++){ total+=arr[i] } return total};()candy([1,0,1])打印任务排序题目:某个打印机根据打印队列执行打印任务。打印任务分为九个优先级,分别采用数字1~9表示,数字越大优先级越高。打印机每次从队列头部取出第一个任务A,然后检查队列余下任务中有没有比A优先级更高的任务,如果有比A优先级高的任务,则将任务A放到队列尾部,否则执行任务A的打印。请编写一个程序,根据输入的打印队列,输出实际打印顺序var print = function(ratings) { let arr=new Array().fill(0); let index=1; while((...ratings)>0){ arr[f((...ratings))]=index; index++; ratings[f((...ratings))]=0; } return arr};// [1,5,3,4,2] 感觉过分简单,可能是我理解错误?(print([3,1,2,2,3]))集五福题目:以0和1组成的长度为5的字符串代表每个人所得到的福卡,每一位代表一种福卡,1表示已经获得该福卡,单类型福卡不超过1张,随机抽取一个小于10人团队,求该团队最多可以集齐多少套五福?输入描述:数组,即团队每个人的福卡拥有状态,输出描述:数字,即最多可以集齐的数量var print = function(ratings) { let arr=new Array(5).fill(0); for(let i=0;i<;i++){ for(let j=0;j<5;j++){ arr[j]+=parseInt(ratings[i][j]) } } return (...arr)};// 1,arr=[ 4, 1, 4, 4, 3 ](print(['10011','10110','01111','10111','10000','00100']))双列表元素分配题目:有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。var getMinusArray = function(a,b) { let suma=0; let sumb=0; for(let i=0;i<;i++){ suma+=a[i]; sumb+=b[i]; } let min=(suma-sumb); for(let i=0;i<;i++){ for(let j=0;j<;j++){ let temp=0; if((2*(b[j]-a[i])+suma-sumb)