程序员老鬼

因为长相猥琐被公司挂了。。。

刚看到个贴子,说有个小伙子去面试,本来学历背景都不错,项目经验也到位,结果最后觉得是因为长相猥琐被挂了。对比之下,另一个长得帅的候选人,HR还主动多帮争取2k工资。

Image

我觉得这事吧,程序员的世界里确实技术才是核心,但现实职场并不是纯粹看能力,外貌、沟通风格、甚至第一印象,都会在无形中影响面试官的判断。就像写代码,逻辑没问题,但界面丑陋、交互不友好,用户还是会觉得“差点意思”。面试就是“产品展示”,包装也很重要。

网友们说“长得丑被挂”其实有点夸张,我更倾向于相信这是综合气质问题,比如面试时不自信、表达不够清晰,容易被误判。程序员再怎么强调技术,也不能忽视软技能。

换个角度想,HR能帮帅哥多要2k,本质上是觉得他更“有价值”——不只是会写代码,还能代表公司形象。说到底,外貌无法选择,但气质、表达和自信是可以训练的。【备注:文末可领最新资料】

算法题:令牌放置

昨天晚上十一点多,在公司楼下等外卖的时候,小李问了我个“令牌放置”的题,意思大概是这样:有一条一维走廊,用字符串表示,. 代表空位能放令牌,# 是障碍放不了。一个令牌能覆盖它自己以及左右相邻三格中的有效格(越界就算没了)。目标——用最少的令牌让所有的 . 都被覆盖上。是不是很像在走廊里摆夜灯,省电省心那种。

从左到右贪心放“最右能放的位置”

具体说人话哈:你扫到位置 i 是未被覆盖的 .,那就优先把令牌放到 i+1(能放的话),因为越靠右,后面的区间就被顺带照亮更多;如果 i+1 是 # 或越界,就退而求其次放在 i;再不行(i 也是 #)就只能放在 i-1,但因为你是从左到右扫到 i 的,说明 i-1 要么早就处理过,要么本来就不是 .,这种“放在左边补救”的情况只在 i 是 # 且左边是 . 时发生,我们在走到那个 . 的时候就已经放过了,所以实现里只需要考虑“先放 i+1,不行放 i”这两步即可。放完记得把被覆盖的区间标记掉,然后指针跳过。

这个策略直觉上好理解:越向右放,覆盖区间向后延,能少放灯。

publicclassTokenPlacement{
// 返回最少令牌数,若无解返回 -1(比如整个字符串里没有能放的位置但有需要覆盖的点)
publicstaticintminTokens(String corridor){
char[] s = corridor.toCharArray();
int n = s.length, i = 0, ans = 0;

while (i < n) {
if (s[i] == '#') { i++; continue; }

// 走到这里,s[i] 是 '.' 且还未覆盖,需要放令牌
// 优先尝试 i+1
if (i + 1 < n && s[i + 1] == '.') {
                ans++;
// 令牌放在 i+1,覆盖 i, i+1, i+2
                i += 3; // 直接跳过被覆盖的区间
            } elseif (s[i] == '.') {
// 放在 i,覆盖 i-1, i, i+1
                ans++;
                i += 2; // i 和 i+1 已覆盖,从 i+2 继续
            } else {
// 理论不会到这,防御性处理
                i++;
            }
        }

// 校验是否真的覆盖了所有 '.'(上面的逻辑保证了,但给个兜底)
// 如果题目要求严格“无可放位且仍有 . 则无解”,可以在循环中提前判断。
return ans;
    }

publicstaticvoidmain(String[] args){
        System.out.println(minTokens(".#...##..")); // 期望:3
        System.out.println(minTokens("..."));       // 期望:1(放中间)
        System.out.println(minTokens("#.#"));       // 期望:0
    }
}

复杂度与边界

时间 O(n),只扫一遍;空间 O(1)。边界别忘了: 1)开头结尾的 .,放在最靠右(i+1)或当前 i 都能自然处理; 2)连续障碍 ### 直接跳; 3)若题目扩展为必须每个令牌恰好覆盖三格或覆盖范围变成半径 R,思路仍是“尽量往右放”,只是覆盖窗口和跳步要改成 R 的版本。

".#...##.."

  • i=0 是 .,i+1 是 #,放在 i=0,覆盖 0,1,跳到 2;
  • i=2 是 .,i+1=3 也是 .,果断放在 3,覆盖 2,3,4,跳到 5;
  • i=5 是 # 连着两个 # 跳到 7;
  • i=7 是 .,i+1=8 越界,放在 7,覆盖 6,7,8(越界),结束,共 3 个。

就这样,思路清、实现短,面试里也好讲。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404