本文介绍: 适用场景:需要对分段多数组中的多个子数组分段处理,每一段处理逻辑相同。
华为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;
}
}
原文地址:https://blog.csdn.net/weixin_45400340/article/details/135929133
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_64021.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。