最近,「在华为,请假一天的代价是3700」的帖子在网络上引发了热烈讨论。
一位华为员工的分享,透露在华为,因为请假会影响到每月的奖金和年终奖,许多员工宁愿选择利用周末加班来「调休」,以避免请假对收入的影响。在华为,周末加班的报酬是双倍工资。
换句话说,一天的请假,相当于放弃了两天的双倍日工资。根据这位员工的描述,我们可以粗略估计,华为员工的月基础工资约为37000元。
这一消息一经发布,立即在网上引起了广泛的讨论。有人感叹华为员工的高收入,有人则对比自己公司的请假政策,感慨万千。
尤其是那句「这么高的base,不是月薪3k的我应该讨论的事情」,更是引发了不少网友的共鸣,笑谈中透露出对高收入群体生活的遥远想象。
但不可否认,这样的请假代价确实很高,足以让人感到「请假很心痛」。
下面是今日算法题
今日算法题,来自LeetCode的第6题:Z 字形变换,下面是我的算法思路及实现,让我们来看看吧。
# 算法题目
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING",行数为 3 时,排列如下:
PA H N
AP L S I I G
YI R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,如上例则为 "PAHNAPLSIIGYIR"。
# 算法思路
实现Z字形变换的关键是找到字符在Z字形排列中的规律,然后根据这个规律来重构字符串。以下是解决这个问题的步骤:
创建行字符串:根据给定的行数,创建相同数量的字符串,用于存放每一行的字符。
定位行索引:初始化当前行的索引为0,并设置一个标志位用于指示索引移动的方向(向下或向上)。
遍历字符:遍历输入字符串中的每一个字符,并将它添加到对应行的字符串上。
如果当前行索引为0,设置标志位,使索引向下移动。
如果当前行索引为给定行数减1,设置标志位,使索引向上移动。
根据标志位更新行索引。
合并行字符串:将所有行的字符串连接起来,形成最终的字符串。
# 代码实现
C语言实现
#include<string.h>
#include<stdlib.h>
char* convert(char* s, int numRows){
if (numRows == 1 || numRows >= strlen(s)) return s;
char **rows = malloc(numRows * sizeof(char*));
for (int i = 0; i < numRows; i++) {
rows[i] = malloc((strlen(s) + 1) * sizeof(char));
rows[i][0] = '\0';
}
int curRow = 0;
int step = -1;
for (int i = 0; s[i] != '\0'; i++) {
strcat(rows[curRow], (char[]){s[i], '\0'});
if (curRow == 0 || curRow == numRows - 1) step = -step;
curRow += step;
}
char *ret = malloc((strlen(s) + 1) * sizeof(char));
ret[0] = '\0';
for (int i = 0; i < numRows; i++) {
strcat(ret, rows[i]);
free(rows[i]);
}
free(rows);
return ret;
}
Java实现
public String convert(String s, int numRows){
if (numRows == 1 || numRows >= s.length()) {
return s;
}
StringBuilder[] rows = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++) rows[i] = new StringBuilder();
int curRow = 0;
boolean goingDown = false;
for (char c : s.toCharArray()) {
rows[curRow].append(c);
if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
StringBuilder ret = new StringBuilder();
for (StringBuilder row : rows) ret.append(row);
return ret.toString();
}
Python实现
defconvert(s: str, numRows: int) -> str:
if numRows == 1or numRows >= len(s):
return s
rows = [''] * numRows
curRow, step = 0, -1
for c in s:
rows[curRow] += c
if curRow == 0or curRow == numRows - 1:
step = -step
curRow += step
return''.join(rows)
# 算法解析
Z字形变换算法的时间复杂度为O(n),其中n是输入字符串的长度,因为每个字符只被处理一次。空间复杂度也为O(n),用于存储重构后的字符串。
# 示例和测试
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
# 总结
Z字形变换问题展示了如何通过找到字符间的规律来解决问题,它不仅锻炼了我们对字符串的处理能力,还教会我们如何将看似复杂的问题简化。掌握这种方法,可以帮助我们更好地解决其他字符串处理问题。
热门推荐