目录
【案例1】
【题目描述】
【思路解析】
【代码实现】
【案例2】 【 2019 网易面试题】
【题目描述】
【思路解析】
【代码实现】
【案例3】
【题目描述】
【思路分析】
【代码实现】
背包问题:
/**
* @ProjectName: study3
* @FileName: Ex6
* @author:HWJ
* @Data: 2023/7/13 12:15
*/
public class Ex6 {
public static void main(String[] args) {
int[] v = {3,2,5,2,3};
System.out.println(getWays(v, 10));
}
public static int getWays(int[] v, int w){
int[][] dp = new int[v.length][w + 1];
dp[0][0] = 1;
dp[0][v[0]] = 1;
for (int i = 1; i < dp.length; i++) {
for (int j = 0; j <= w; j++) {
if (j >= v[i]){
dp[i][j] = dp[i-1][j] + dp[i-1][j - v[i]];
}else {
dp[i][j] = dp[i-1][j];
}
}
}
int res = 0;
for (int i = 0; i <= w; i++) {
res += dp[v.length - 1][i];
}
return res;
}
}
同一个工作,可以去无数个人。
先将工作按照难度排序,然后就得到了所有工作在不同难度上的最优解,有序表中存放相同难度利益最大的那个,然后再满足有序表中的工作难度增大时,利益同时增大的表。
import java.util.*;
/**
* @ProjectName: study3
* @FileName: Ex7
* @author:HWJ
* @Data: 2023/7/13 13:31
*/
public class Ex7 {
public static void main(String[] args) {
Job job = new Job(5, 3);
Job job1 = new Job(14, 6);
Job job2 = new Job(12, 5);
Job job3 = new Job(9, 3);
Job job4 = new Job(25, 8);
Job job5 = new Job(15, 7);
Job job6 = new Job(14, 11);
Job job7 = new Job(5, 2);
Job job8 = new Job(6, 9);
Job[] jobs = {job,job1,job2,job3,job4,job5,job6,job7,job8};
int[] ability = {1,5,74,5,6,24,5,6,3,2,1,4,5,8,9,7,15,2,25,624,24};
System.out.println(Arrays.toString(salary1(jobs, ability)));
System.out.println(Arrays.toString(salary2(jobs, ability)));
}
public static class Job {
public int money;
public int hard;
public Job(int money, int hard) {
this.money = money;
this.hard = hard;
}
}
// 使用有序表做
public static int[] salary1(Job[] jobs, int[] ability) {
Arrays.sort(jobs, new Comparator() {
@Override
public int compare(Job o1, Job o2) {
return o1.hard != o2.hard ? o1.hard - o2.hard : o2.money - o1.money;
}
});
TreeMap map = new TreeMap<>();
map.put(jobs[0].hard, jobs[0].money);
Job pre = jobs[0];
for (int i = 1; i < jobs.length; i++) {
if (jobs[i].hard > pre.hard && jobs[i].money > pre.money) {
pre = jobs[i];
map.put(pre.hard, pre.money);
}
}
int[] res = new int[ability.length];
for (int i = 0; i < res.length; i++) {
Integer key = map.floorKey(ability[i]);
res[i] = key == null ? 0 : map.get(key);
}
return res;
}
}
总结日常书写形式的规范:
(1)数字之外只允许有减号‘-’出现。
(2)如果有‘-’,只能在开头,并且只能出现一次,且后面必须跟数字,但数字不能是0.
(3)如果开头数字是0,后面不能在出现字符了。
如果这个字符串合法,转为int类型数字时,需要时刻判断是否越界了。又因为int负数的值更大,所以我们统一将所有的数刚开始都转为负数,然后再转为相应的值。
/**
* @ProjectName: study3
* @FileName: Ex8
* @author:HWJ
* @Data: 2023/7/13 14:03
*/
public class Ex8 {
public static void main(String[] args) {
}
public static boolean convert(String strs) {
char[] str = strs.toCharArray();
if (str[0] == '-' && (str.length == 1 || str[1] == '0')) {
return false;
}
if (str[0] != '-' && (str[0] > '9' || str[0] < '0')) {
return false;
}
if (str[0] == '0' && str.length > 1) {
return false;
}
for (int i = 1; i < str.length; i++) {
if (str[i] > '9' || str[i] < '0') {
return false;
}
}
return true;
}
}