第一题
第一个案例就告诉我们,只需要前3个数
显然有两种特殊案例
1是第一个个数为0.则需要用0占位
2是第二个个数为零,则不需要占位,直接输出
我的第一种想法是一个字符一个字符的输入,然后截止到n位
第二种想法是把整行输入,再拼接
我尝试第二种方法,但是java报错了
可能是nextLine();
把换行符读入了
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class W3T11 {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
InputStreamReader ins = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(ins);
String num;
num=sc.next();
int n = Integer.parseInt(num);
if(n!=0){
String str1,str2,str3;
try {
str1= br.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
str1=str1.substring(0,n*2);
num=sc.next();
int m = Integer.parseInt(num);
if(m!=0){
str2=br.readLine();
str2=str2.substring(0,m*2);
str3= new StringBuilder().append(str1).append(str2).toString();
System.out.println(str3);
}
else {
System.out.println(str1);
}
}
}
}
所以得换一种
没办法,只有存成一个个数字
这里排序可以用自带的函数偷懒(数组和字符串)
import java.util.Arrays;
int[] nums = {2,5,0,4,6,-10};
Arrays.sort(nums);
int[] nums = {2,5,0,4,1,-10};
//对前四位元素进行排序
Arrays.sort(nums, 0, 4);
for(int i :nums)
System.out.print(i+" ");
/* 之前:2 5 0 4 1 -10
* 结果:0 2 4 5 1 -10
*/
int[] nums = {2,5,0,4,1,-10};
Arrays.fill(nums, 1);
for(int i :nums)
System.out.print(i+" ");
/* 之前:2 5 0 4 1 -10
* 结果:1 1 1 1 1 1
*/
int[] nums = {2,5,0,4,1,-10};
//对数组元素下标2到4的元素赋值为3
Arrays.fill(nums,2,5,3);
for(int i :nums)
System.out.print(i+" ");
/* 之前:2 5 0 4 1 -10
* 结果:2 5 3 3 3 -10
*/
int[] nums = {2,5,0,4,1,-10};
System.out.println(Arrays.toString(nums));
/*
* 结果:[2, 5, 0, 4, 1, -10]
*/
看同学的代码才知道,之前一直处理不了的输入问题,因为回车不会被nextInt录入,所以要用nextLine吃掉回车
String与各种类型互转
取第一个字符
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String str1,str2;
int m,n;
Scanner scanner = new Scanner(System.in);
m=scanner.nextInt();
scanner.nextLine();
str1=scanner.nextLine();
n=scanner.nextInt();
scanner.nextLine();
str2=scanner.nextLine();
String[] num1s=new String[m];
String[] num2s=new String[n];
long[] num1=new long[m];
long[] num2=new long[n];
Arrays.fill(num1s,"");
Arrays.fill(num2s,"");
int i,j=0;
for(i=0;i<m;i++) {
while (str1.charAt(j)!=' ') {
num1s[i]+=str1.charAt(j);
j++;
}
j++;
num1[i]= Long.parseLong(num1s[i]);
}
j=0;
str2+=' ';
for(i=0;i<n;i++) {
while (str2.charAt(j)!=' ') {
num2s[i]+=str2.charAt(j);
j++;
}
j++;
num2[i]= Long.parseLong(num2s[i]);
}
long[] num=new long[m+n];
int k=0;
for(i=0,j=0;k<m+n;k++) {
if(i==m) {
num[k]=num2[j];
j++;
}
else if(j==n) {
num[k]=num1[i];
i++;
}
else if(num1[i]<num2[j]) {
num[k]=num1[i];
i++;
}
else {
num[k]=num2[j];
j++;
}
}
for(i=0;i<m+n-1;i++) System.out.printf("%d ",num[i]);
System.out.println(num[i]);
}
}
第二题
他说了不要硬算,应该就是计算2和5为因子出现的次数
最后计算两者的最小值就行
显然要用bigteger
然后循环的条件需要用它们比大小,之前作业里介绍的函数少了一个
package com.yiibai;import java.math.*;public class BigIntegerDemo {public static void main(String[] args) {
// create 2 BigInteger objects
BigInteger bi1, bi2;
bi1 = new BigInteger("6");
bi2 = new BigInteger("3");
// create int object
int res;
// compare bi1 with bi2
res = bi1.compareTo(bi2);
String str1 = "Both values are equal ";
String str2 = "First Value is greater ";
String str3 = "Second value is greater";
if( res == 0 )
System.out.println( str1 );
else if( res == 1 )
System.out.println( str2 );
else if( res == -1 )
System.out.println( str3 );
}}
让我们编译和运行上面的程序,这将产生以下结果:
First Value is greater
不过我觉得出题人挺sb的,学java天天不练别的,就和biginteger过不去,这又不是多难的算法,就是得找对应的大数字函数。
第一次除错,是因为应加上5或2的多少次方
但是我估计用这么多biginteger又得超时,他奶奶滴
换一种想法
因为2比5多得多,所以只用考虑5
比如100,先除以5,有20个5的倍数,一直除,直到比5小,就没有5了
import java.math.BigInteger;
import java.util.Scanner;
public class W3T2 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String num;
num=sc.next();
BigInteger b=new BigInteger(num);
BigInteger ans=BigInteger.valueOf(0);
BigInteger shu5= b.divide(BigInteger.valueOf(5));
BigInteger a=BigInteger.valueOf(1);
while(shu5.compareTo(BigInteger.valueOf(0))!=0){
ans=ans.add(shu5);
shu5=shu5.divide(BigInteger.valueOf(5));
}
System.out.println(ans);
}
}
第三题这个又是我最不熟悉的字符串。。
看了题目就想到解法了,但是可惜java没指针
我们需要四个指针,我们命名为1.2.3.4一对指针指向两个头节点,首先2和4比对,相同的话把12.34向后移动,不相同的话,4向后移动,继续比对,假如存在相同的,就把4再向后移动一次,3再移动到4处,假如4到最后也没有相同的话,就把1和2往后挪一位,4回到3处
显然这样一个一个比对可能有答案但不一定是最优解,那么我们再让3.4为首选位,移动1.2一次,比对两次得到的解,看谁的更长用谁的
这是另一种解法
import java.util.Arrays;
import java.util.Scanner;
public class Atest {
public static int[][] LCSLength ( char[] x, char[] y) {
int m = x.length;
int n = y.length;
int[][] b = new int[x.length][y.length];
int[][] c = new int[x.length][y.length];
for(int i = 1; i < m; i++) {
c[i][0] = 0;
}
for(int i = 1; i < n; i++) {
c[0][i] = 0;
}
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
if(x[i] == y[j]) {
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
else if(c[i-1][j] >= c[i][j-1]) {
c[i][j] = c[i-1][j];
b[i][j] = 2;
}
else {
c[i][j] = c[i][j-1];
b[i][j]=3;
}
}
}
return b;
}
public static void LCS(int[][] b, char[] x, int i, int j) {
if(i == 0|| j == 0) return;
if(b[i][j] == 1) {
LCS(b,x,i - 1, j - 1);
System.out.print(x[i]);
}
else if(b[i][j] == 2) {
LCS(b,x,i - 1, j);
}
else LCS(b,x,i, j-1);
}
public static void main(String args[]) {
String num;
int m,n;
Scanner scanner = new Scanner(System.in);
num=scanner.next();
int len1,len2;
len1=num.length();
char[] x,y;
x=num.toCharArray();
num=scanner.next();
len2=num.length();
y=num.toCharArray();
x = Arrays.copyOf(x, len1+1);
y = Arrays.copyOf(y, len2+1);
for(int i = len1;i>0;i--){
x[i]=x[i-1];
}
x[0]=' ';
for(int i = len2;i>0;i--){
y[i]=y[i-1];
}
y[0]=' ';
int[][] b = LCSLength(x, y);
LCS(b, x, x.length - 1, y.length - 1);
System.out.println();
}
}
第四题
出题人的意图是让我们掌握自定义函数,但是对于我来说,最难的是处理输入输出。。各种格式问题,比如怎么把数字录入到数组里(java)的各种格式转换真的丑陋
这里有个遍历的操作,String data: nu
前面的循环函数只能用for
写了一半才看到全是Long,奶奶滴,这不是考验写方法吗,怎么所有的都要用大数据
可能是为了算法超时
然后需要用函数去递归这个数组
第一次debug原因是字符串相等不能用==
要用func.equals("gcdi")
第二次debug原因是字符串输入用的.next而应该用.nextLine
提交之后两个WA
原因可能是最大公倍数我用的暴力计算
算法是两个数除以最大公约数再相乘就是最小公倍数,
但发现不是,其实是lcmu打错了,果然不改算法就TLE了
import java.util.Arrays;
import java.util.Scanner;
public class W3T4 {
public static long som(long x, long y) {
return (x + y);
}
public static long mini(long x, long y) {
if (x > y) {
return y;
} else return x;
}
public static long maxi(long x, long y) {
if (x > y) {
return x;
} else return y;
}
public static long gcdi(long x, long y) {
x = Math.abs(x);
y = Math.abs(y);
if (y == 0) {
return x;
}
else return gcdi(y,x%y);
}
public static long lcmu(long x, long y) {
return Math.abs(x/gcdi(x,y)*y);
}
public static void main(String[] args){
String num,fct;
Scanner scanner = new Scanner(System.in);
fct=scanner.nextLine();
long arr[]=new long[200];
num=scanner.nextLine();
String nu[]=num.split(" ");
int n=0;
for(String data : nu){
arr[n]=Long.parseLong(data);
n++;
}
num=scanner.next();
long init=Long.parseLong(num);
long ans[]=new long[200];
if(fct.equals("som")){
for(int i=0;i<n;i++){
ans[i]=som(init,arr[i]);
init=ans[i];
}
}
if(fct.equals("mini")){
for(int i=0;i<n;i++){
ans[i]=mini(init,arr[i]);
init=ans[i];
}
}
if(fct.equals("maxi")){
for(int i=0;i<n;i++){
ans[i]=maxi(init,arr[i]);
init=ans[i];
}
}
if(fct.equals("lcmu")){
for(int i=0;i<n;i++){
ans[i]=lcmu(init,arr[i]);
init=ans[i];
}
}
if(fct.equals("gcdi")){
for(int i=0;i<n;i++){
ans[i]=gcdi(init,arr[i]);
init=ans[i];
}
}
for(int i=0;i<n;i++){
if(i!=n-1){
System.out.print(ans[i]+" ");
}
else System.out.println(ans[i]);
}
}
}