程序员面试题01
Posted 电王子豪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试题01相关的知识,希望对你有一定的参考价值。
程序员面试金典 01刷题回忆录
文章目录
01.01 判断字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = “leetcode”
输出: false
示例 2:
输入: s = “abc”
输出: true
限制:
0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-unique-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
bool isUnique(string astr) {
int x = 0; //如果大小写字母都有,应该要用long 类型了
for(int i = 0; i < astr.size(); i++) {
if(x & (1 << (astr[i] - 'a'))) return false;
else x |= (1 << (astr[i] - 'a'));
}
return true;
}
};
考察的是位运算,一个int是32个字节,而小写字母总共有26个。
&是逻辑与运算符,|是逻辑或运算符
01.02 判断是否互为字符重排
用哈希表很简单
01.03 URL化
URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例 1:
输入:"Mr John Smith ", 13
输出:“Mr%20John%20Smith”
示例 2:
输入:" “, 5
输出:”%20%20%20%20%20"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-url-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
string replaceSpaces(string S, int length) {
int count=0;
for(int i=0;i<length;i++)
{
if(S[i]==' ') count++;
}
int oldindex=length-1,newindex=oldindex+2*count; //因为是索引,所以要-1
S=S.substr(0,newindex+1); //在原数组里修改...
while(oldindex<newindex)
{
if(S[oldindex]==' ')
{
S[newindex--]='0';
S[newindex--]='2';
S[newindex--]='%';
oldindex--;
}
else
S[newindex--]=S[oldindex--];
}
return S;
}
};
这个主要是从后往前对字符串进行操作
01.04 回文排列
还是哈希表
01.05 一次编辑
很普通,顺着逻辑写就行
01.06 字符串压缩
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:“aabcccccaaa”
输出:“a2b1c5a3”
示例2:
输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
string compressString(string S) {
string res="";
int len =S.size();
int num=1;
for(int i=1;i<len+1;i++){
if(S[i]==S[i-1])num++;
else{
res+=S[i-1]+to_string(num);
num=1;
}
}
return res.size()>=S.size()?S:res;
}
};
注意几点
1.比如string a=“asdf”; a.size()为4,是可以访问a[4]的,访问结果是’\\0’,但是不能访问a[5].
2.注意int转string的函数 to_string()
3.代码中是从下标1开始进行的循环,最后一次循环,比较的是’\\0’不等于字符串的最后一个。
01.07 旋转矩阵
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-matrix-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < (n + 1) / 2; ++j) {
tie(matrix[i][j], matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1]) = make_tuple(matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1], matrix[i][j]);
}
}
}
};
用C++17 写的,主要是用到了tie和make_tuple()
当然也可以用数学,先进行水平翻转,再根据主对角线交换两侧,也可以。
01.08 零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int flag_col0 = false;
for (int i = 0; i < m; i++) {
if (!matrix[i][0]) {
flag_col0 = true;
}
for (int j = 1; j < n; j++) {
if (!matrix[i][j]) {
matrix[i][0] = matrix[0][j] = 0;
}
}
}
for (int i = m - 1; i >= 0; i--) {
for (int j = 1; j < n; j++) {
if (!matrix[i][0] || !matrix[0][j]) {
matrix[i][j] = 0;
}
}
if (flag_col0) {
matrix[i][0] = 0;
}
}
}
};
主要是空间复杂度为O(1)很爽
让第0行和第0列作为判0标记
同时这也导致了for循环要从最后一行往前跑
当然别忘记第0列的特殊地位
01.09 字符串轮转
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = “waterbottle”, s2 = “erbottlewat”
输出:True
示例2:
输入:s1 = “aa”, s2 = “aba”
输出:Fals
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-rotation-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
原来字符串的轮转是这个意思。可以轻松的用find找到答案
class Solution {
public:
bool isFlipedString(string s1, string s2) {
return s1.size() == s2.size() && (s1 + s1).find(s2) != string::npos;
}
};
s1和s2的地位是等价的。
以上是关于程序员面试题01的主要内容,如果未能解决你的问题,请参考以下文章