复试机试准备

容易忘记的操作

擦除空格

str.erase(remove(str.begin(), str.end(), ' '), str.end());

向上取整

printf("%.0f\n", ceil(a));

向下取整

printf("%.0f\n", floor(a));

算法

初始化素数数组

先将数组初始化为true,然后从i开始每次的倍数改成false,记得i 的平方不能大于最大int 的最大表示范围,即65536。在用另外一个int数组来记录当前的素数。

void init() {
    for (int i = 0; i < N; i++) isPrime[i] = true;
    for (int i = 2; i < N; i++) {
        if (!isPrime[i]) continue;
        if (primepos > 10000) break;
        Prime[++primepos] = i;
        if (i >= 65536) continue;
        for (int j = i*i; j >= 0 && j < N; j+=i) {
            isPrime[j] = false;
        }
    }
}

质因数分解

先初始化质数数组,再通过for循环统计

int factorization(int num, int factors[]) {
	int pos = 0;
    int len = sqrt(num);
	for (int i = 2; i <= len; i++) {
		while (num != 0 && num % i == 0) {
			factors[pos++] = i;
			num /= i;
		}
	}
    if (num > 1) factors[pos++] = num;
	return pos;
}

最大公约数

int gcd(int num1, int num2) {
	if (num2 == 0) return num1;
	return gcd(num2, num1%num2);
}

最小公倍数

int lcm(int num1, int num2) {
	int factor = gcd(num1, num2);
	return num1/factor*num2; // 考虑到溢出的可能性,先除后乘
}

kmp算法

重点是next数组的建立,next数组是针对pattern的,初始化为-1,相同则等于 next[i] = k,不同则等于k = next[k]。其次重点是循环遍历的时候,注意将不同的时候,j = next[j]+1,因为在i的for循环中i已经自动+1了。

void get_next(int* next, char* p, int n) {
    next[0] = -1;
    int k = -1, j = 0;
    while (j < n) {
        if (k == -1 || p[j] == p[k]) {
            k++;
            j++;
            next[j] = k;
        } else {
            k = next[k];
        }
    }
}
    for (i = 0; i < n; i++) {

        if (t[i] == p[j]) j++;
        else j = next[j]+1;
    	if (j == m) {
            count++;
            j = next[j];
        }
    }

第k大的数

找第k大的数,利用快排的思想(swap可以用algorithm里面的)

    	int find(vector<int>& nums, int first, int last, int k) {
    		if (first > last) return -1;
   			else if (first == last) return nums[first];
    		int key = nums[first];
    		for (int i = last; i > first; i--) {
    			if (nums[i] >= key) {
    				swap(nums, last, i);
    				last--;
    			}
    		}
    		swap(nums[first], nums[last]);
    		if (k == nums.size()-last) return nums[last];
    		else if (k > nums.size()-last) return find(nums, first, last-1, k);
    		else return find(nums, last+1, nums.size()-1, k);
    	}

数学表达式的计算

#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
#include <cctype>
using namespace std;

double calculate(string str);
double parseNum(string str, int& i);
double parseExpr(string str, int& i);


int main() {
    string str;
    cin >> str;
    double res = calculate(str);
    printf("%0.0f\n", res);
    return 0;
}

double calculate(string str) {
    cout << str << endl;
    str.erase(remove(str.begin(), str.end(), ' '), str.end());
    int i = 0;
    cout << str << endl;
    double res = parseExpr(str, i);
    return res;
}

double parseExpr(string str, int& i) {
    stack<double> sta;
    char op = '+';
    double tmp = 0;
    for (; i < str.size() && str[i] != ')'; i++) {
        double num = 0;
        if (str[i] == '(') tmp = parseExpr(str, i);
        else tmp = parseNum(str, i);
        switch(op) {
            case '-':
                sta.push(-tmp);
                break;
            case '+':
                sta.push(tmp);
                break;
            case '*':
                num = sta.top() * tmp;
                sta.pop();
                sta.push(num);
                break;
            case '/':
                num = sta.top() / tmp;
                sta.pop();
                sta.push(num);
                break;
        }
        op = str[i];
        tmp = 0;
    }
    double res = 0;
    while (!sta.empty()) {
        res += sta.top();
        sta.pop();
    }
    return res;
}

double parseNum(string str, int& i) {
    double res = 0;
    for (; i< str.size(); i++) {
        if (isdigit(str[i])) res = res*10 + str[i] - '0';
    }
    return res;
}

排列组合

关键点:j -> i,

void init() {
	Cmn[0][1] = Cmn[1][1] = 1;
	for (int i = 1; i < 21; i++) {
		Cmn[0][i] = 1;
    	for(int j=1;j<=i;j++) 
        	if(i==j) Cmn[j][i]=1;  
	        else Cmn[j][i]=Cmn[j-1][i-1]+Cmn[j][i-1];  // 
	}
	return;
}

附:

  1. bool isdigit(char c);<iostream>已经定义了
  2. 注意看清楚样例的输出格式,特别是没有oj系统时。
  3. 注意调试cout出来的数记得注释掉
  4. 递归返回条件顺序容易错,判断先返回还是先处理再返回。见combination-sum-ii/
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ECNU计科考研复试是上海东华大学计算科学与技术专业硕士研究生复试环节的一部分。一般包括计算基础知识测、编程实践、算法设计与分析、数据结构、数据库等内容。 的目的是通过实际操作和任务完成,评估考生的计算基础知识、编程能力和解决问题的能力。一般会提供一些实际问题,考生需要根据题目要求进行编程实现,并实现功能要求以及考察的相关知识点。的题目会有一定的难度,需要考生具备扎实的计算基础知识和编程实践经验。 针对ECNU计科考研复试准备,考生可以从以下几个方面进行: 1. 夯实计算基础知识:系统复习计算组成原理、操作系统、数据结构、数据库等相关课程的基础知识点,理解并掌握核心概念和原理。 2. 学习编程技巧:熟练掌握至少一种编程语言,例如C++、Java等,并了解常用的编程工具和调技巧,提高编程能力。 3. 解题经验积累:多做一些编程题和算法题,提高解题能力和编程实践经验。可以通过参加一些线上或线下的编程竞赛来提升自己的算法和编程水平。 4. 多做模拟:通过模拟,熟悉的形式和题目类型,提前感受的压力和难度,并对自己的不足进行总结和改进。 总之,ECNU计科考研复试是对考生计算基础知识和编程实践能力的综合考查,需要考生充分准备和深入理解相关知识点。只有全面提高自己的计算科学水平,才能在中取得好成绩。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值