前言
补一下周末合刊,周末有些事情耽误了,抱歉。感觉今年的雪确实很多,今天我们这里又下雪了,快过年了,大家大概也有些家务在身,加油。
主要内容
我的代码展示将以idea的格式展示题目在代码中的注释中
1
java
package com.njx.topic1;
import java.util.Random;
public class Test {
public static void main(String[] args) {
//红包问题
//给你两个整数M和N,M表示红包的总额,N表示红包的个数
//现在又N个人来抽红包,每个人都是随机的,打印每个人领的红包金额
//注1:每个人最少1分钱
//注2:每个人领完红包之后,至少预留1*N分钱
//注3:最后一个人是拿剩余的总额
//定义变量表示总额
int money=20000;//分
//定义红包个数
int n=5;
//判断红包金额是否足够,即没人最少1分钱
if(money<n)
{
System.out.println("红包金额不够");
}else {
//循环抽取红包
Random r=new Random();
for (int i = 1; i <= n-1; i++) {
//利用Random随机抽取 1 2 3 4 表示第几人抽取
// 4 3 2 1 表示预留的钱
//money-(n-i):至少给后面的人预留一分钱
//+1:至少给最后一个人预留一分钱
int Mymoney=r.nextInt(money-(n-i))+1;
//总额减去当前红包金额
money-=Mymoney;
System.out.println("第"+(i+1)+"个人抢到"+Mymoney+"分钱");
}
//最后一人抢到的钱
System.out.println("最后一个人抢到"+money+"分钱");
}
}
}
2
java
package com.njx.topic1;
public class Test2 {
public static void main(String[] args) {
//中位数
//给定两个正序数组 arr1和 arr2,请先合并数组,并找出合并之后数组的中位数。
// 举例:123456789
//中位数:5
//123456
//中位数:
//(3+4)/ 2
//定义两个数组
int arr1[]={1,3,5,7,9};
int arr2[]={2,4};
double number=findmedianarray(arr1,arr2);
System.out.println(number);
}
public static double findmedianarray(int[] arr1,int[] arr2)
{
//将arr1与arr2合并
//1.定义一个大数组
int[] arr=new int [arr1.length+arr2.length];
//保证正序
//暴力不管顺序,先放入数据在排序
//思路简单但是效率低
//快捷思路一边添加一边排序
//前提arr1和arr2都是正序的
//2定义两个变量,充当箭头
int index1=0;
int index2=0;
//遍历
for (int i = 0; i < arr.length; i++) {
//若arr1短
if(index1==arr1.length){
arr[i]=arr2[index2];
index2++;
continue;
}
//若arr2短
if(index2==arr2.length){
arr[i]=arr[index1];
index1++;
continue;
}
//判断index1与index2指向的数谁小,添加谁
if(arr1[index1]<arr2[index2]){
arr[i]=arr1[index1];
index1++;
}else{
arr[i]=arr2[index2];
index2++;
}
}
//求中位数
//判断奇数偶数
//元素 1 2 3 4 5 6
//索引 0 1 2 3 4 5
if (arr.length%2==0){
int num1=arr[arr.length/2];
int num2=arr[arr.length/2-1];
return (num1+num2)/2.0;
}else{
int num=arr[arr.length/2];
return num;
}
}
}
3
java
package com.njx.topic1;
import java.util.Random;
public class Test3 {
public static void main(String[] args) {
//统计个数
//学校选举学生会主席,有5个候选人
//全校1000名同学参与投票(每人一票,可以弃权,或者选1-5号)。投票使用Random模拟。0:弃权,1~5:给对应的候选人投票
//要求1:
//统计每个候选人的得票数和得票率,找出得票最多的候选人?
//要求2:
//统计弃票数和弃票率是多少?
//1创建长度为6的数组,0索引代表弃权,1~5索引代表1~5号候选人
int[] arr=new int[6];
//2循环1000次
Random r=new Random();
for (int i = 0; i < 1000; i++) {
//生成1-5投票数
int vote=r.nextInt(0,6);
arr[vote]++;
}
//3统计每个候选人得票数和得票率
for (int i = 1; i < arr.length; i++) {
System.out.println("第"+i+"个候选人的得票数是"+arr[i]+",得票率是"+(arr[i]*1.0/1000)*100+"%");
}
//4找出最多票数
int max=arr[1];
for (int i =2; i < arr.length; i++) {
if(max<arr[i]){
max=arr[i];
}
}
//5票数最多的候选人
//可能票数相同
for (int i= 1; i < arr.length; i++) {
if(max==arr[i]){
System.out.println("第"+i+"个候选人票数最多,共计"+arr[i]+"张票");
}
}
//6统计弃票数和弃票率
System.out.println("弃票数是"+arr[0]+",弃票率是"+arr[0]*1.0/1000*100+"%");
}
}
4
java
package com.njx.topic1;
public class Test4 {
public static void main(String[] args) {
//接雨水 难,中大厂考题 动态规划
//给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水
//输入: height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6
//解释: 下面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, 可以接 6个单位的雨水 (蓝色部分表示雨水)
//1定义数组
int[] arr={0,1,0,2,1,0,1,3,2,1,2,1};
//2从左向右遍历,记录雨水加柱子面积总和
//2.1定义数组记录从左向右看的数据
int [] leftMax=new int[arr.length];
//2.2定义第三方变量temp,记录最高柱子
int temp=arr[0];
//2.3从左向右遍历
for (int i = 0; i < arr.length; i++) {
if(temp>arr[i]){
leftMax[i]=temp;
}else{
leftMax[i]=arr[i];
temp=arr[i];
}
}
//3从右向左遍历,记录雨水加柱子面积总和
int [] rightMax=new int[arr.length];
temp=arr[arr.length-1];
for (int i = arr.length-1; i >=0; i--) {
if(temp>arr[i]){
rightMax[i]=temp;
}else{
rightMax[i]=arr[i];
temp=arr[i];
}
}
//4取交集
int[] result=new int[arr.length];
for(int i=0;i<arr.length;i++){
if(leftMax[i]< rightMax[i]){
result[i]=leftMax[i];
}else{
result[i]=rightMax[i];
}
}
int sum=0;
for (int i = 0; i < arr.length; i++) {
sum+=result[i]-arr[i];
}
System.out.println(sum);
}
}
5
java
package com.njx.topic1;
import java.util.Scanner;
import java.util.Random;
public class Test5 {
public static void main(String[] args) {
//彩票规则:
//前区:1~35选5个号码(唯一)后区:1~12选2个号码(唯一)跨区可重复
//中奖规则:
//一等奖:5+2
//二等奖:5+1
//三等奖:5+0/4+2四等奖:4+1 / 3+ 2
//五等奖:4+0/ 3+1/ 2+ 2
//六等奖:3+0/1+2/2+1/0+2
//1利用Random随机生成彩票号码
int [] lotteryNumber =createLotterynumber();
printLotteryNumber(lotteryNumber);
//2利用scanner模拟购买彩票
int [] myLotteryNumber=buyLotteryNumber();
printLotteryNumber(myLotteryNumber);
//3判断中奖情况
//判断中几个前区
//判断中几个后区
getWinnerNumber(lotteryNumber,myLotteryNumber);
}
//判断arr2中数据,在arr1中出现几次
//arr1真正号码
//arr2用户购买的彩票
public static void getWinnerNumber(int[] arr1,int[] arr2) {
//判断前区
int count1 = getCount(arr1, arr2, 0, 4);
//判断后区
int count2 = getCount(arr1, arr2, 5, 6);
//判断中奖情况
if(count1==5&&count2==2){
System.out.println("恭喜中奖了,一等奖!");
}else if(count1==5&&count2==1){
System.out.println("恭喜中奖了,二等奖!");
} else if (count1==4&&count2==2||count1==5&&count2==0) {
System.out.println("恭喜中奖了,三等奖!");
} else if (count1==4&&count2==1||count1==3&&count2==2) {
System.out.println("恭喜中奖了,四等奖!");
} else if (count1 == 3 && count2 == 0 || count1 == 3 && count2 == 1 || count1 ==2 && count2 == 2) {
System.out.println("恭喜中奖了,五等奖!");
}else if(count1==3&&count2==0||count1==2&&count2==1||count1==1&&count2==2||count1==0&&count2==2){
System.out.println("恭喜中奖了,六等奖!");
}else{
System.out.println("未中奖!");
}
}
//判断前区或后区中了几个求
public static int getCount(int[] arr1,int[] arr2,int start,int end){
int count = 0;
for (int i = start; i <= end; i++) {
boolean flag = contains(arr2[i], arr1, 0, 4);
//如果当前数字已存在,表示中了一个
if(flag){
count++;
}
}
//当循环结束就知道中的号码个数
return count;
}
public static int[] buyLotteryNumber() {
//1创建数组
int[] arr = new int[7];
//2利用scanner模拟购买彩票,1-35选五个(唯一)
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < 5; ) {
System.out.println("请输入第" + (i + 1) + "个前区号码(1-35):");
int number = scanner.nextInt();
//范围
if(number<1||number>35){
System.out.println("输入的号码超出范围,请重新输入:");
continue;
}
//判断是否唯一
boolean flag = contains(number, arr, 0, 4);
if(flag){
System.out.println("该号码已存在,请重新输入:");
continue;
}
//如果代码能运行到这里,说明输入的号码是合法的
arr[i]=number;
i++;
}
//3输入后区号码(1-12选两个唯一)
for (int i = 5; i < 7; ) {
System.out.println("请输入第" + (i - 4) + "个后区号码(1-12):");
int number = scanner.nextInt();
//范围
if(number<1||number>12){
System.out.println("输入的号码超出范围,请重新输入:");
continue;
}
//判断是否唯一
boolean flag = contains(number, arr, 5, 6);
if(flag){
System.out.println("该号码已存在,请重新输入:");
continue;
}
//如果代码能运行到这里,说明输入的号码是合法的
arr[i]=number;
i++;
}
scanner.close();
return arr;
}
public static int[] createLotterynumber() {
//1创建数组
int[] arr = new int[7];
//利用Random随机生成前区五个1~35的随机数,并保存在数组中
Random r = new Random();
for (int i = 0; i < 5; ) {
int number = r.nextInt(1,36);
boolean flag = contains(number, arr, 0, 4);
if(! flag){
arr[i] = number;
i++;
}
}
//利用Random随机生成后区两个1~12的随机数,1-12 并保存在数组中
for (int i = 0; i < 2; ) {
int number = r.nextInt(1,13);
boolean flag = contains(number, arr, 5, 6);
if(! flag){
arr[i+5] = number;
i++;
}
}
return arr;
}
public static boolean contains(int number,int[] arr,int start,int end)
{
for (int i = start; i <= end; i++) {
if(arr[i]==number)
{
return true;
}
}
return false;
}
public static void printLotteryNumber(int[] arr) {
System.out.println("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.println(arr[i]);
} else {
System.out.print(arr[i] + "、");
}
}
System.out.println("]");
}
}
6
java
package com.njx.topic1;
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
//X 星球的考古学家发现了一批古代留下来的密码。
//
//这些密码是由 A、B、C、D 四种植物的种子串成的序列。
//
//仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
//
//由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
//
//你的任务是:给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
//文章核心:最少删除/插入使字符串成为回文
//模板
//1. 计算最长回文子序列 LPS
//2. 答案 = 字符串长度 - LPS
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int n = s.length();
// dp[i][j] 表示 s[i..j] 的最长回文子序列长度
int[][] dp = new int[n][n];
// 1. 初始化:单个字符
for (int i = 0; i < n; i++) {
dp[i][i] = 1;
}
// 2. 区间 DP
// i 从后往前,j 从前往后
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
// 最长回文子序列长度
int lps = dp[0][n - 1];
// 最少脱落(删除)数量
int result = n - lps;
System.out.println(result);
sc.close(); // Scanner 关闭要在 main 里面
}
}
最后一语
周末合刊的内容大多来自黑马讲解的内容,题目较难,若又看不懂的可在评论区留言或者看黑马的视频,java+ai系列。
当生命的时针有张有弛,疾徐有致地行走时,我们的日子才会随着日升日落发出流水一样清脆的足音。
------ 迟子建 《也是冬天,也是春天》
感谢观看,共勉!!