(不保证代码完全正确,自己敲的可能存在不完善的地方,请各位大佬发现后指出,谢谢!)
暂时结束。
2019上机题
1、
题目:
输入日期格式:YYYYMMDD,求与 20190205 相隔的天数。
输入:
20190208
输出:
3
解析:
运用Java的日期类来解决。
import java.util.*;
import java.math.*;
import java.text.*;
public class test19_01 {
public static Date parseDate(String date) throws ParseException{
if(date.isEmpty()){
// 将字符串转化为日期格式
return null;
}
return new SimpleDateFormat("yyyyMMdd").parse(date);
}
public static int differentDaysByString(String date1,String date2) throws ParseException
{
// 计算相差天数
int days = (int) ((parseDate(date2).getTime() - parseDate(date1).getTime()) / (1000*3600*24));
return days;
}
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
String s1 = "20190205";
Scanner scanner = new Scanner(System.in);
String s2 = scanner.next();
System.out.println(differentDaysByString(s1, s2));
}
}
2、
题目:
给定一个数字序列 A1,A2…An,求 i,j(1<=i<=j<=n),使得 Ai+…+Aj 最大,输出这个最大和。
输入:
6
-2 11 -4 13 -5 -2
输出:
20
解析:
dp问题,求最长连续子序列。(尝试复习用java写了,c++也一样)
import java.*;
import java.util.Scanner;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
public class test19_02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] A = new int[n+1];
for (int i=1;i<=n;i++)
{
A[i]=scanner.nextInt(); // 读取数组
}
int[] dp = new int[n+1];
int ans=A[1];
for(int i=1;i<=n;i++)
{
dp[i]=Math.max(A[i], dp[i-1]+A[i]); // 分两种情况,取第i个元素和不取
ans = Math.max(dp[i], ans);
}
System.out.println(ans);
}
}
3、
题目:
求 N 个结点能够组成的二叉树的个数。
输入:
3
输出:
5
解析:
这就是卡特兰数。之前在做408的时候,问n个元素入栈,有几种出栈情况。转化为以先序次序入栈,中序次序出栈,又因为先+中可唯一确定一棵二叉树。因此,出入栈情况就是对应的二叉树个数。注意要用大整数,因为要乘法。(不过不清楚n要不要用大整数)
import java.*;
import java.math.BigInteger;
import java.util.Scanner;
public class test19_03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 公式 (2n*2(n-1)*....*n)/(n*(n-1)*...*1)/(n+1) 就是卡特兰数
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
BigInteger n1 = BigInteger.valueOf(1);
for(int i=0;i<n;i++)
{
n1=n1.multiply(BigInteger.valueOf(n-i));
}
BigInteger n2 = BigInteger.valueOf(1);
for(int i=0;i<n;i++)
{
n2 = n2.multiply(BigInteger.valueOf(2*n-i));
}
BigInteger ans = n2.divide(n1).divide(BigInteger.valueOf(n+1));
System.out.println(ans);
}
}
2018上机题
1、
题目:
求众数。 众数就是一个序列中出现次数最多的数字。 如果不唯一,则输出小的那个值。 给定第一个代表有几个数字。 1<=n<=10^5 每个数字在 int 范围内。
输入:
8
10 3 8 8 3 2 2 2
输出:
2
解析:
这里要注意的是,可能有负数出现,所以不能直接用计数数组。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
int n;
vector<int> temp;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int d;
scanf("%d",&d);
temp.push_back(d); // 不用hash数组是因为可能有负数
}
sort(temp.begin(),temp.end()); // 题目要求从小输出,所以先排序
int MAX=-1,ans=temp[0];
int num=1;
for(int i=1;i<n;i++)
{
if(temp[i]==temp[i-1])
{
num++;
if(num>MAX)
{
MAX=num;
ans=temp[i];
}
}else{
num=1;
}
}
printf("%d",ans);
return 0;
}
2、
题目:
解方程。 给定一个字符串,代表一个 一元一次 方程。 如果有解求解,输出格式“x=数字” ,如果解的个数无穷,输出 “infinite solutions”。 如果没有解输出“no solution”字符串长度不超过 256 。
输入:
10x-2x-8=4x+7+x
输出:
x=5
解析:
这题可能存在一点问题,因为题目没有说方程是否一定有意义,因此可能出现没有x、没有‘=’这样的情况。而且字符串长度不超过256位,可能会有超过int位数的情况。
总的思路就是,将方程化为AX+B=0的情况。因此方程的解:-B/A
#include <cstdio>
#include <cstring>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <sstream>
using namespace std;
int main()
{
string s;
getline(cin,s);
string num="";
int xNum=0; // x前系数
int cNum=0; // 常数
bool you =false; // 表示到达等式右边
for(int i=0;i<s.length();i++)
{
if(isdigit(s[i]))
{
num+=s[i];
if(i==s.length()-1)
{
stringstream ss;
ss<<num;
int inum;
ss>>inum;
if(you)
cNum-=inum;
else
cNum+=inum;
}
}else if(s[i]=='x')
{
if(num.empty() || num=="+"||num=="-")
num+='1';
stringstream ss;
ss << num;
int inum;
ss >> inum;
if(you)
xNum-=inum;
else
xNum+=inum;
num.clear();
}else if((s[i]=='+'||s[i]=='-')&&!num.empty()){
// 此时是常数
stringstream ss;
ss<<num;
int inum;
ss>>inum;
if(you)
cNum-=inum;
else
cNum+=inum;
num.clear();
num+=s[i]; // 注意把此时的符号给加上
}else if((s[i]=='+'||s[i]=='-')&&num.empty())
{
num+=s[i];
}else if(s[i]=='='&&!num.empty()) // 等号前常数
{
stringstream ss;
ss<<num;
int inum;
ss>>inum;
if(you)
cNum-=inum;
else
cNum+=inum;
num.clear();
you=true;
}else if(s[i]=='=')
{
you=true;
}
}
if