13-19年复旦大学计算机学院研究生复试机试题

(不保证代码完全正确,自己敲的可能存在不完善的地方,请各位大佬发现后指出,谢谢!)
暂时结束。

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
  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值