Python技术迷

为什么有的外包比正编工资还高?

最近我在网上闲逛,偶然看到了个有意思的贴子——为什么有的外包比正编工资还高?我也跟着好奇起来,决定一探究竟,看看网友们怎么说的。

Image

网上对这个问题看法各不相同。有的网友一脸决然:“你想多了,不可能的事情”毕竟在我们的印象中,外包的待遇是不太理想的。

Image

然而,也有人来了句:“外包现金不多点谁去干!”这话就很直接,哪有人不看重薪水多少呢?

Image

还有网友跳出来分析:看起来,外包的月入可能确实比正式职位的要高一点点,但外包的所有收入也就每月那点工资,总包和综合收入不如正式工。

Image

Image

这么一想,虽然外包看起来月入还不错,但总体来说,可能还是赶不上正式员工的福利待遇。再说了,正式员工还有工作稳定性、职业发展这些加成,不是吗?

Image

那么,为啥会出现这种情况呢?其实,这背后挺能反映出公司招人策略的。有些特定的项目或者急需完成的工作,公司可能会优先考虑用外包的形式来迅速招募特定技能的人才。为了吸引这些能人,自然就得在薪酬上更大方一点。

下面是今日的大厂算法题

今日算法题,来自LeetCode的第29题:两数相除,下面是我的算法思路及实现,让我们来看看吧。

算法题目

给定两个整数,被除数 dividend 和除数 divisor,将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。

专属福利 
👉点击领取:最全Python资料合集
算法思路

解决这个问题的关键在于使用“位移”操作,以2的幂次逼近除数,直到找到最接近被除数的值。步骤如下:

  1. 处理符号:首先判断结果的符号是否为负。

  2. 转为正数处理:为简化问题,将被除数和除数都转为正数处理。注意处理溢出问题。

  3. 逼近被除数:使用循环,每次将除数左移(即乘以2),直到它超过被除数。然后从被除数中减去当前的除数值,累加到商中。

  4. 返回结果:根据最开始判断的符号,返回正数或负数的结果。

代码实现
Go语言实现
package main
import ( "fmt" "math")
func divide(dividend int, divisor int) int { if dividend == math.MinInt32 && divisor == -1 { return math.MaxInt32 } sign := 1 if (dividend < 0) != (divisor < 0) { sign = -1 } dvd, dvs := abs(dividend), abs(divisor) res := 0 for dvd >= dvs { temp, multiple := dvs, 1 for dvd >= (temp << 1) { temp <<= 1 multiple <<= 1 } dvd -= temp res += multiple } return sign * res}
func abs(x int) int { if x < 0 { return -x } return x}
func main() { fmt.Println(divide(10, 3)) fmt.Println(divide(7, -3))}

Java实现

public class Solution {    public int divide(int dividend, int divisor) {        if (dividend == Integer.MIN_VALUE && divisor == -1) {            return Integer.MAX_VALUE;        }        long dvd = Math.abs((long)dividend);        long dvs = Math.abs((long)divisor);        int result = 0;        while (dvd >= dvs) {            long temp = dvs, multiple = 1;            while ((temp << 1) <= dvd) {                temp <<= 1;                multiple <<= 1;            }            dvd -= temp;            result += multiple;        }        return ((dividend < 0) == (divisor < 0)) ? result : -result;    }}

JavaScript实现

function divide(dividend, divisor) {    const MAX_INT = 2 ** 31 - 1, MIN_INT = -(2 ** 31);    if (dividend === MIN_INT && divisor === -1) {        return MAX_INT;    }    let sign = (dividend > 0) === (divisor > 0) ? 1 : -1;    let dvd = Math.abs(dividend);    let dvs = Math.abs(divisor);    let res = 0;    while (dvd >= dvs) {        let temp = dvs, multiple = 1;        while ((temp << 1) <= dvd) {            temp <<= 1;            multiple <<= 1;        }        dvd -= temp;        res += multiple;    }    return sign === 1 ? res : -res;}

算法解析

此算法通过位移操作模拟除法过程。while循环使得每次操作都尽可能让除数倍增接近被除数,从而在不使用乘法、除法和mod运算符的情况下计算出商。注意处理边界条件,如结果溢出。

示例和测试
console.log(divide(10, 3)); // 应输出 3console.log(divide(7, -3)); // 应输出 -2console.log(divide(-2147483648, -1)); // 应输出 2147483647,因为结果溢出
总结
通过这个例子,我们学会了如何在不使用乘法、除法和mod运算符的情况下,使用位操作来实现两数相除。这种思考方式不仅加深了我们对位操作的理解,也提高了我们解决问题的灵活性。
Image
 1
Image
热门推荐
Image