为什么大厂研发的老婆都是美女~
刚看到个贴子,大家都在聊大厂程序员为啥老婆一个比一个漂亮,真有点迷惑。作为程序员我真想说,这事还真不是靠会写代码就能“写”出来的😂。
我觉得这事吧,本质还是“价值匹配”那套。大厂程序员虽然性格上大多内向,但靠着能力、收入和相对稳定的生活,的确挺有吸引力。网友们总是调侃说技术宅只会敲代码,现实里人家早把生活经营明白了。你说开朗幽默也许不是强项,但靠谱踏实这一点,很多女生都很看重。
再说现在程序员也越来越会生活,健身、旅游、理财样样都有,根本不是只懂写代码的“直男”形象。
当然,也有网友说是“资源溢出”,但我觉得归根到底还是互相吸引,程序员的优点远不止外表那么简单。最后,别羡慕别人,提升自己才是正道。【备注:文末可领最新资料】
面试题:变为棋盘
题目其实是这样的:给你一个n x n的0和1的方阵,让你每次可以交换任意两行或者两列,你需要最少操作几步把它变成像国际象棋棋盘那样的格局——相邻的格子都不同。不能变就直接-1。
讲道理,这种题我第一反应是——要么直接暴力,要么肯定有点规律啥的。反正昨晚在沙发上刷了半个小时,后来我家猫还跳到键盘上把我代码都踩错了。气人。
说说我的思路哈。首先棋盘格的本质是什么?其实就是“01交替”,对吧?所以你要是想把一个n x n的矩阵变成那样,你第一行和第一列肯定得满足有两种情况:
比如说0101这种,或者1010这种,就是你翻来覆去只能有这两种。 然后你看剩下的行(列),它们只能和这两种一样,要么就是第一行/列本身,要么就是“反过来”的那种。
所以我当时脑袋里模拟了一下,假设第一行是1010,那么棋盘格只有两种选择:要么以1010开头,要么以0101开头,其它都不行。
代码部分来了就简单说点思路,不整那些花里胡哨的注释哈。其实一共就四步:
判断行和列只出现两种互为反的模式。 判断数量也得对,比如偶数n,数量对半分,奇数n,多的只能多一个。 算一下最少得换几次,把“1”都挪到对的位置去。 不符合规则直接-1。
我随手写了个代码,python的:
defmovesToChessboard(board):
n = len(board)
# 统计行和列的模式
rows = [''.join(str(c) for c in row) for row in board]
cols = [''.join(str(board[r][c]) for r in range(n)) for c in range(n)]
rowset = set(rows)
colset = set(cols)
if len(rowset) != 2or len(colset) != 2:
return-1
r1, r2 = list(rowset)
c1, c2 = list(colset)
# 必须互为反
ifnot all(a != b for a, b in zip(r1, r2)):
return-1
ifnot all(a != b for a, b in zip(c1, c2)):
return-1
# 行列个数也得对
ifnot (abs(rows.count(r1) - rows.count(r2)) <= 1and abs(cols.count(c1) - cols.count(c2)) <= 1):
return-1
defget_moves(lines, n):
line1 = list(lines[0])
ones = sum(int(x) for x in line1)
if n % 2 == 0:
res1 = sum(int(line1[i]) != i % 2for i in range(n))
res2 = sum(int(line1[i]) == i % 2for i in range(n))
return min(res1, res2) // 2
else:
target = 0if ones < n//2+1else1
res = sum(int(line1[i]) != (i % 2) for i in range(n)) if target == 1else sum(int(line1[i]) == (i % 2) for i in range(n))
return res // 2
row_moves = get_moves([list(map(int, x)) for x in rows], n)
col_moves = get_moves([list(map(int, x)) for x in cols], n)
return row_moves + col_moves
你要真让我现场解释,我就只能边敲边想,反正主逻辑是先校验是否合法,然后就是看要交换几次行、几次列,每次都找错位的最小数目。偶数奇数还得单独分下情况,不然你容易被奇数搞晕。其实写多了这种题你就习惯了。
哦对了,我写到一半还去厨房煮了个面,回来一看还敲错缩进了,python不愧是缩进折磨机。写完测试的时候记得拿个特例,比如只有一行、一列,或者本来就是棋盘格的,必须能输出0。
这题其实也没啥算法门槛,就是细心点,别被边界条件坑到。上面思路基本都写了,代码也有,你自己可以拉到本地随便试试,反正我的那台破笔记本都能秒跑。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领