母校升本科了,我简历填本科还是专科合适?

文摘   2024-12-20 12:04   陕西  
今天聊个很实际的问题:母校升本科了,我该在简历上填“本科”还是“专科”?
这个问题其实挺常见的,尤其是对于一些专科院校在升本后的同学来说。老实说,很多人都有点困惑,因为学校变了,自己是否也能“跟着升值”?
毕竟,母校升级了,我们的学历是应该自动跟着升高吗?其实,我觉得要看清楚自己毕业证上的信息。
网友说得很对:以学位证为准,你毕业证上写的是什么,才是你简历里的真实情况。
你毕业那年是专科毕业,就算学校后面升了本科,你的学历依然是专科。就像学校倒闭了,国家承认你上过学,但并不代表你的学位会变。
简历上的学历,不能为了面子去写“本科”,那样就是在做假,简历上的真假可比代码的bug还要明显。
当然,如果你的母校本身是一个升级后的大品牌(比如原本是专科,现在升成了本科甚至更高),那确实可以在面试时提一提,不失为一个加分项。
但要确保,不是通过简历“升级”自己的学历,而是通过正确的方式去展示你真正的成长。
总结就是,保持简历的真实性,过度美化反而会踩雷。

算法题:优美的排列

今天我们来聊一个稍微有点挑战性的算法题:优美的排列。说实话,这个题目在面试中还挺常见的,尤其是在一些大厂的技术面里。优美的排列不仅考察你对数学的理解,还能检验你对回溯算法的掌握程度。简单点说,这道题就是要你用数学的视角去理解排列的优美性,同时实现一个高效的算法。
话不多说,先来看一下题目描述:
给定一个正整数 n,你需要找出所有长度为 n 的排列 **[1, 2, ..., n]**,并且满足以下条件:
  1. 对于每一个位置 i,数字 i 和数字 nums[i] 满足 i % nums[i] == 0 或者 nums[i] % i == 0
举个例子吧,如果 n = 3,那我们要列出所有的排列 [1, 2, 3],然后验证它们是否符合上述条件。如果是符合条件的排列,咱们就把它保留下来。
这题考的就是回溯法,大家都知道回溯法一般用来处理所有排列或组合的问题。我们可以通过递归的方式生成所有可能的排列,然后逐个验证这些排列是否符合条件。
先给大家看一个简单的 Java 代码实现:
import java.util.ArrayList;
import java.util.List;

public class Solution {
    public List<List<Integer>> beautifulArrangements(int n) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> arrangement = new ArrayList<>();
        boolean[] visited = new boolean[n + 1];  // 用来标记哪些数字已经被选过
        backtrack(n, res, arrangement, visited);
        return res;
    }

    private void backtrack(int n, List<List<Integer>> res, List<Integer> arrangement, boolean[] visited) {
        if (arrangement.size() == n) {
            res.add(new ArrayList<>(arrangement));  // 找到一个满足条件的排列
            return;
        }
        
        for (int i = 1; i <= n; i++) {
            if (visited[i]) continue;  // 如果已经选择过该数字,跳过
            if (arrangement.size() + 1 % i == 0 || i % (arrangement.size() + 1) == 0) {  // 满足条件
                arrangement.add(i);
                visited[i] = true;
                backtrack(n, res, arrangement, visited);  // 递归选择下一个数字
                visited[i] = false;  // 回溯
                arrangement.remove(arrangement.size() - 1);
            }
        }
    }
}
这段代码的核心就是递归。通过 backtrack 方法,我们试图生成一个所有符合条件的排列。每次递归时,我们都试图将一个数字 i 加入到当前排列中,并且检查它是否符合条件。如果符合条件,就继续递归,直到排列长度达到 n 为止。然后,我们把这个排列加入结果列表。如果当前数字不符合条件,就跳过它,回到上一步。
一个常见的问题是,回溯的递归和剪枝,如何在正确的位置进行。大家可以看到我们在递归的过程中,加入了一个 visited 数组来确保每个数字只会出现在排列中一次。而且我们还在每次递归时验证 i % nums[i] == 0 或者 nums[i] % i == 0,这样保证了我们的排列符合题目要求。
算法分析
回溯法的时间复杂度通常会非常高,特别是当 n 的值比较大时。因为在最坏的情况下,我们需要生成所有的排列,然后验证每个排列是否满足条件。生成所有排列的时间复杂度是 O(n!),而每次验证排列的条件的时间复杂度是 O(n)。所以总体时间复杂度大约是 O(n * n!),这对于较小的 n 是可以接受的,但如果 n 较大(比如超过 10),就会变得非常慢。
不过,不要忘了回溯算法的一个特点,那就是可以通过剪枝来优化效率。比如,在递归的过程中,我们不必每次都遍历所有的数字,而是可以跳过那些不符合条件的数字。这样做能显著减少无效的递归调用。
总结
这道题实际上考察的是回溯算法的基本思想和实现技巧。对于像我这样一个程序员来说,能够解决这样的问题,算是对算法的基础知识有了一个比较深入的理解。当然,最难的部分还是如何在递归中处理好剪枝,保证算法的效率。希望大家在做这类题目时,能够多从递归的角度来思考,优化每一步,逐步提升自己的算法能力。

-END-


ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言

程序员老鬼
10年+老程序员,专注于AI知识普及,已打造多门AI课程,本号主要分享国内AI工具、AI绘画提示词、Chat教程、AI换脸、Chat中文指令、Sora教程等,帮助读者解决AI工具使用疑难问题。
 最新文章