为什么有的外包比正编工资还高?
最近我在网上闲逛,偶然看到了个有意思的贴子——为什么有的外包比正编工资还高?我也跟着好奇起来,决定一探究竟,看看网友们怎么说的。
网上对这个问题看法各不相同。有的网友一脸决然:“你想多了,不可能的事情”毕竟在我们的印象中,外包的待遇是不太理想的。
然而,也有人来了句:“外包现金不多点谁去干!”这话就很直接,哪有人不看重薪水多少呢?
还有网友跳出来分析:看起来,外包的月入可能确实比正式职位的要高一点点,但外包的所有收入也就每月那点工资,总包和综合收入不如正式工。
这么一想,虽然外包看起来月入还不错,但总体来说,可能还是赶不上正式员工的福利待遇。再说了,正式员工还有工作稳定性、职业发展这些加成,不是吗?
那么,为啥会出现这种情况呢?其实,这背后挺能反映出公司招人策略的。有些特定的项目或者急需完成的工作,公司可能会优先考虑用外包的形式来迅速招募特定技能的人才。为了吸引这些能人,自然就得在薪酬上更大方一点。
下面是今日的大厂算法题
今日算法题,来自LeetCode的第29题:两数相除,下面是我的算法思路及实现,让我们来看看吧。
算法题目
给定两个整数,被除数 dividend 和除数 divisor,将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。
专属福利 👉点击领取:最全Python资料合集
解决这个问题的关键在于使用“位移”操作,以2的幂次逼近除数,直到找到最接近被除数的值。步骤如下:
处理符号:首先判断结果的符号是否为负。
转为正数处理:为简化问题,将被除数和除数都转为正数处理。注意处理溢出问题。
逼近被除数:使用循环,每次将除数左移(即乘以2),直到它超过被除数。然后从被除数中减去当前的除数值,累加到商中。
返回结果:根据最开始判断的符号,返回正数或负数的结果。
package mainimport ("fmt""math")func divide(dividend int, divisor int) int {if dividend == math.MinInt32 && divisor == -1 {return math.MaxInt32}sign := 1if (dividend < 0) != (divisor < 0) {sign = -1}dvd, dvs := abs(dividend), abs(divisor)res := 0for dvd >= dvs {temp, multiple := dvs, 1for dvd >= (temp << 1) {temp <<= 1multiple <<= 1}dvd -= tempres += 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,因为结果溢出
热门推荐