华为1.24秋招笔试题
1.题目1
题目详情 - 2024.1.24-华为秋招笔试-第一题-计算积分 - CodeFun2000
1.1题解
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s=sc.next();
char[] ch=s.toCharArray();
int res=0;
int i=0;
int n=ch.length;
while(i<n){
int start=i;
if(ch[i]=='r')res+=1;
else if(ch[i]=='g')res+=2;
else if(ch[i]=='b')res+=3;
i++;
while(i<n && ch[i]==ch[i-1]){
if(ch[i]=='r')res+=1;
else if(ch[i]=='g')res+=2;
else if(ch[i]=='b')res+=3;
res+=(i-start);
i++;
}
}
System.out.println(res);
}
}
1.2循环数组模板
-
适用场景:需要对分段多数组中的多个子数组分段处理,每一段处理逻辑相同
-
核心思想
- 外层负责遍历组之前的准备工作,记录开始位置,更新答案
- 内层负责遍历,找出这一组最远在哪结束
int n = nums.length;
int i = 0;
while (i < n){
start = i//外层
//内层
while (i < n && ...){
i += 1;
}
}
2.题目2
题目详情 - 2024.1.24-华为秋招笔试-第二题-大模型训练 - CodeFun2000
2.1思路分析
- 这道题与lc 410 分割数组最大值一样,只不过进行了包装而已
- 贪心+二分
- 我们这里使用二分搜索算力的最低值 UP
- up值越小,段数越多,时间越长;反之越少,时间越短
- 如果在up的情况下,贪心划分出的段数小于 T 说明还可以继续降低up
- 否则 需要增加up
2.2代码
import java.util.*;
class Main{
static int t;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
t=sc.nextInt();
int[] task=new int[n];
int sum=0;
int l=0;
for(int i=0;i<n;i++){
task[i]=sc.nextInt();
l=Math.max(task[i],l);
sum+=task[i];
}
int r=sum;
while(l<r){
int mid=l+r>>1;
if(check(task,mid)){
r=mid;
}else l=mid+1;
}
System.out.println(l);
}
//贪心划分模板可以记一下
static boolean check(int[] nums,int up){
int cnt=1;//至少可以划分为1份
int sum=0;
for(int num:nums){
if(sum+num>up){
cnt++;
sum=num;
}else{
sum+=num;
}
}
return cnt<=t;
}
}