Java程序设计-编程作业3

这次作业比以前稍微难了一点,需要注意的细节比较多(对我说是
(先占个坑 改天慢慢把知识点 代码缕缕出来

1、常见字符串操作:
https://www.cnblogs.com/StarZhai/p/10577880.html

2、关于 ArrayIndexOutOfBoundsException 报错:
https://blog.csdn.net/qq120633269/article/details/86377252

3、Arrays.sort方法重写Comparator对int[]排序:

4、生成指定范围的随机数:
https://www.cnblogs.com/xwdreamer/archive/2012/06/13/2547426.html

5、最大子序列和,算法核心: d[i] = d[i-1]>=0 ? d[i-1]+nums[i] : nums[i]


3.1 求子数组最大和(java)

【问题描述】给定一个数组,求数组中某一段元素和的最大值。注意这一段元素是连续的。如[31,-41,59,26,-53,58,97,-93,-23,84],的最大和是187=59+26+(-53)+58+97

【输入形式】第一行输入数组长度N(0<N<=20000)后面N行输入数组元素

【输出形式】输出子数组的最大和

【样例输入】
10
31
-41
59
26
-53
58
97
-93
-23
84

【样例输出】
187

【代码】

package a3;
import java.util.Scanner;
import java.util.Arrays;

public class A1 {
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int[] num=new int[20005];
		int[] a=new int[n+1];
		
		for(int i=0;i<n;i++) {
		    num[i]= scan.nextInt();
		    if(a[i]>=0) a[i+1]=num[i]+a[i];
		    else a[i+1]=num[i];
		}
		scan.close();
		Arrays.sort(a);
		System.out.print(a[n]);
	}
}


3.2 跳跃最大长度(java)

【问题描述】给一个非负整数数组。假设你最初的位置为0,数组中每一个元素的值代表你能跳跃最大的长度,判断是否能达到数组的最后一个位置

【输入形式】
第一行数组长度
第二行输入一个非负整数数组

【输出形式】布尔类型的值

【样例输入】
5
1 2 3 1 4

【样例输出】
true

【样例输入】
5
1 2 1 0 4

【样例输出】
false

【代码】

package a3;
import java.util.Scanner;

public class A2 {
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int[] num=new int[n];
		int[] flag=new int[n];
		for(int i=0;i<n;i++)
		{
			num[i]=scan.nextInt();
		}
		scan.close();
		
		flag[0]=1;
		for(int i=0;i<n;i++)
		{
			if(flag[i]==1)
			{
				for(int j=0;j<=num[i];j++)
				{
					if(i+j<=n-1)
					flag[(i+j)]=1;
				}
			}
		}
		if(flag[n-1]==1) System.out.print("true");
		else System.out.print("false");
	}

}


3.3 去重与排序(Java)

【问题描述】明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。Input Param n 输入随机数的个数 inputArray n 个随机整数组成的数组 Return Value OutputArray 输出处理后的随机整数

【输入形式】输入多行,先输入随机整数的个数n,再输入相应个数的整数

【输出形式】输出一行,处理后的结果

【样例输入】
11
10 20 40 32 67 40 20 89 300 400 15

【样例输出】
10 15 20 32 40 67 89 300 400

【代码】

package a3;
import java.util.Scanner;
import java.util.Arrays;

public class A3 {
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int[] a=new int[n];
		for(int i=0;i<n;i++)
		{
			a[i]=scan.nextInt();
		}
		scan.close();
		Arrays.sort(a);
		for(int i=0;i<n-1;i++)
		{
			if(a[i]==a[i+1])
				a[i]=0;
		}
		for(int i=0;i<n;i++)
		{
			if(a[i]!=0) System.out.print(a[i]+" ");
		}
	}
}


3.4 学生成绩(java)

【问题描述】老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

【输入形式】输入包括多组测试数据。每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。 学生ID编号从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩,接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为’Q’的时候, 表示这是一条询问操作,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少,当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

【输出形式】对于每一次询问操作,在一行里面输出最高成绩.

【样例输入】
5 7
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 4 5
U 2 9
Q 1 5

【样例输出】5 6 5 9

【代码】

package a3;
import java.util.Scanner;
import java.util.Arrays;

public class A4 {
	public static void main(String[] agrs) {
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int m=scan.nextInt();
		int[] score=new int[n];
		for(int i=0;i<n;i++)
		{
			score[i]=scan.nextInt();
		}
		
		while(true)
		{
			if(m==0) break;
			String c=scan.next();
			//System.out.println("c="+c);
			int a=scan.nextInt();
			int b=scan.nextInt();
			if(c.charAt(0)=='Q')
			{
				//System.out.println("yes");
				int max=score[a-1];
				for(int i=a;i<b;i++)
				{
					if(max<score[i]) max=score[i];
				}
				System.out.print(max+" ");
			}
			else
			{
				score[a-1]=b;
			}
			m--;
			//System.out.println("m="+m);
		}
		scan.close();
	}
}

3.5 供应商问题(JAVA)

【问题描述】
有n个某种商品供应商,某地有m个商店,商店需要从供应商那里进货该商品,每个供应商的供应能力有上限,每个商店都有自己的商品需求量(need[i]:表示第i个商店的需求),每个供应商运送单位商品到商店需要一个运费。

【输入形式】
输入说明:第一行包含两个整数N,M
接下来N行包含三个整数,第一个数表示供应商编号,第二数表示供应能力上限,表示该供应商的供应量不能超过这个上限,第三个数表示运送单位商品到商店的运费。
接下来M行包含两个整数,第一个数表示商店编号,第二个数表示某种商品的需求量。

【输出形式】
输出说明:若可以满足所有商店需求,则输出格式如下:每行第一个数表示供应商编号,第二个数为商店编号,第三个数为供应量。
如:1 2 20
表示第1个供应商给第2个商店供应20个单位量的商品
按商店编号顺序,输出所有供应路径(最后一行无换行符)。
若不满足,输出-1

【样例输入】
4 4
0 20 8
1 15 3
2 55 6
3 40 10
0 28
1 36
2 49
3 12

【样例输出】
1 0 15
2 0 13
2 1 36
2 2 6
0 2 20
3 2 23
3 3 12

【代码】

package a3;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;

public class A5 {
	public static void main(String[] agrs)
	{
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int m=scan.nextInt();
		int[][] pro=new int[n][4];
		int[][] shop=new int[m][2];
		int[][] out=new int[10000][3];
		
		for(int i=0;i<n;i++)
		{
			pro[i][1]=scan.nextInt();
			pro[i][2]=scan.nextInt();
			pro[i][3]=scan.nextInt();
			pro[i][0]=pro[i][3];
		}
		for(int i=0;i<m;i++)
		{
			shop[i][0]=scan.nextInt();
			shop[i][1]=scan.nextInt();
		}
		scan.close();
		
		Arrays.sort(pro, new Comparator<int[]>() 
		{
			public int compare(int[] o1, int[] o2) 
			{
			if (o1[0]==o2[0]) return o1[1]-o2[1];
			return o1[0]-o2[0];
			}
		});
		
		/*for(int i=0;i<n;i++)
		{
			System.out.print(pro[i][0]+" ");
			System.out.print(pro[i][1]+" ");
			System.out.print(pro[i][2]+" ");
			System.out.println(pro[i][3]+" ");
		}*/
		
		int k=0;
		int i=0;
		int num;
		int or=0;
		while(true)
		{
			if(pro[k][2]==0) k++;
			if(shop[i][1]==0) i++;
			if(i>=m) 
			{
				for(int j=0;j<or;j++)
				{
					System.out.println(out[j][0]+" "+out[j][1]+" "+out[j][2]);
				}
				break;
			}
			if(i<m && k>=n) 
			{
				System.out.print("-1");
				break;
			}
				
			
			num=pro[k][2]-shop[i][1];
			
			if(num>=0) 
			{
				pro[k][2]=pro[k][2]-shop[i][1];
				out[or][0]=pro[k][1];
				out[or][1]=shop[i][0];
				out[or][2]=shop[i][1];
				or++;
				/*System.out.print(pro[k][1]+" ");
				System.out.print(shop[i][0]+" ");
				System.out.println(shop[i][1]);*/
				shop[i][1]=0;
			}
			else if(num<0)
			{
				shop[i][1]=shop[i][1]-pro[k][2];
				out[or][0]=pro[k][1];
				out[or][1]=shop[i][0];
				out[or][2]=pro[k][2];
				or++;
				/*System.out.print(pro[k][1]+" ");
				System.out.print(shop[i][0]+" ");
				System.out.println(pro[k][2]);*/
				pro[k][2]=0;
			}
		}
	}

}


3.6 进制转化(java)

【问题描述】写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入)

【输入形式】输入一个十六进制的数值字符串。

【输出形式】输出该数值的十进制字符串。

【样例输入】0xA

【样例输出】10

【代码】

package a3;
import java.util.Scanner;

public class A6 {
	public static void main(String[] agrs)
	{
		Scanner scan=new Scanner(System.in);
		String str=scan.nextLine();
		int len=str.length();
		String str2=str.substring(2,len);
		int len2=len-2;
		int j=1;
		int sum=0;
		for(int i=len2-1;i>=0;i--)
		{
			if(str2.charAt(i)>='A'&&str2.charAt(i)<='F')
			{
				sum=sum+(Integer.valueOf(str2.charAt(i))-55)*j;
			}
			else 
			{
				sum=sum+Integer.valueOf(str2.charAt(i)-48)*j;
			}
			j=j*16;
		}
		System.out.print(sum);
}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值