网友爆料:男友19年入职字节,现在月薪9万,在北京买了房,那时候他可风光了,可5年过去了,身体越来越虚。。

文摘   2024-12-18 11:00   陕西  

最近看到一个网友爆料,挺有意思的,忍不住想聊聊。

这位网友说,她男友2019年入职字节跳动,刚开始月薪9万,在北京买了房,那时候可谓是风光无限,生活也很滋润。她男朋友也确实做得不错,典型的年轻程序员,事业起步很高。不过,5年过去了,故事的结局有点让人唏嘘——身体越来越虚,常常感觉疲惫不堪。


说实话,你看我们这行,常常是“拼劲头”和“拼体力”。刚开始确实很拼,薪水也很高,感觉自己跟“互联网巨头”挂上了钩,生活一片光明。

但随着时间的推移,身体和心理上的压力慢慢积累,生活节奏快,时常加班,熬夜成了家常便饭,身体确实不太能承受得住。


作为程序员,不得不承认,这个行业有时候真的是一个“双刃剑”。一方面,薪水高,机会多,工作看似轻松,但另一方面,身体和精神上的消耗也非常巨大。

健康真的不容忽视啊!不管是刚进大厂的年轻人,还是已经有了几年经验的我们,都得学会平衡工作和生活,适时地放松自己,保持身心健康。毕竟,身体是革命的本钱呀!

算法题:IPO

最近刷算法题的时候,我遇到了一个有趣的题目:IPO。对,没错,就是“Initial Public Offering”——上市这个概念。你可能会想,IPO和算法有什么关系?毕竟,程序员平时都在考虑怎么优化性能,或者如何调试代码,怎么突然变得像是在玩股市了?

但问题的核心其实在于:如何根据一组数据,选择最优的IPO顺序。我们来理清楚这道题目:假设你有多个公司,每个公司都有一个预计的利润和成本,你的目标是决定你能从这些公司中选择多少个公司,来使得最终获得的总利润最大。

你可以理解为在一个有限的资本中,如何选择最值得投资的公司,使得投资的回报最大化。这就是所谓的“IPO问题”。

理解题目

首先,我得声明一下:这个题目并不是要你搞清楚股市的各种操作,实际上它更多的是考察你对优先队列、贪心算法以及动态规划的理解。

你有一个资本k,初始为0,你可以通过投资不同的公司,来获得他们的利润。每个公司都有一个花费(即IPO的成本)和预计回报(即投资该公司后你能赚取的利润)。投资后的利润会增加你的资本。然后,你用这些增加的资本再去投资其他公司。

思路分析

我们可以从一个最直观的思路入手。首先,投资的顺序必须优先考虑成本较低、回报较高的公司。所以,假设我们有一个数据结构companies,它包含了每个公司的成本和预期的回报。我们可以利用最小堆(或优先队列)来进行排序,首先投资最小成本的公司。

这里我们就需要两个主要的数据结构:

  1. 一个最大堆(优先队列)来存储可选择的公司(按预计回报排序)。
  2. 一个最小堆来存储尚未投资的公司(按花费排序)。

实现方案

接下来,我们直接看代码,顺便加一些注释。代码思路大致是:首先,先把所有公司按成本升序排序。然后,用最大堆来存储当前我们有能力投资的公司。每次选择最大的回报来投资,直到资本无法继续扩展为止。

import java.util.*;

public class IPO {
    public int findMaximizedCapital(int k, int W, int[] Profits, int[] Capital) {
        int n = Profits.length;
        
        // Step 1: Sort companies by capital required (ascending order)
        int[][] companies = new int[n][2];
        for (int i = 0; i < n; i++) {
            companies[i][0] = Capital[i];  // Capital required
            companies[i][1] = Profits[i];  // Profit generated
        }
        
        Arrays.sort(companies, (a, b) -> a[0] - b[0]); // Sort by capital
        
        // Step 2: Max-heap to store the profits we can invest in
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a); 
        
        int i = 0// pointer to the companies array
        // Step 3: Simulate the investment process
        for (int j = 0; j < k; j++) {
            // Add all companies that we can afford based on current capital W
            while (i < n && companies[i][0] <= W) {
                maxHeap.offer(companies[i][1]); // Add profit to the heap
                i++;
            }
            
            // If the heap is not empty, we can pick the company with the max profit
            if (!maxHeap.isEmpty()) {
                W += maxHeap.poll(); // Invest in the company with the highest profit
            }
        }
        
        return W; // Final capital after k investments
    }

    public static void main(String[] args) {
        IPO ipo = new IPO();
        int[] profits = {123};
        int[] capitals = {012};
        int k = 2// Number of investments
        int W = 0// Initial capital
        
        int result = ipo.findMaximizedCapital(k, W, profits, capitals);
        System.out.println("Maximized capital: " + result);
    }
}

代码解析

首先,我们通过companies数组将每个公司(包含其资本和预期回报)按花费(资本)排序。然后,我们用最大堆来存储那些当前可以投资的公司的利润。每次我们从堆中取出最大利润的公司来投资,这样就能保证每次投资的回报最大。

算法时间复杂度

  • 排序操作的时间复杂度是 O(n log n),因为我们需要对公司的资本进行排序。
  • 最大堆的插入和删除操作的时间复杂度是 O(log n),因此整个循环的复杂度为 O(k log n)

总的来说,算法的时间复杂度是 O(n log n + k log n),其中 n 是公司数,k 是最多能进行的投资次数。

-END-


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

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

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