面试题 01.07. 旋转矩阵
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
方法一:辅助空间
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
vector<vector<int>>newmatrix=matrix;
int m=matrix[0].size();//行
int n=matrix.size();//matrix 列 //列没用到
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
newmatrix[j][m-i-1]=matrix[i][j];
}
}
matrix=newmatrix;
}
};
图形的旋转 ,其实只用到了一边就是matrix的行。
注意:
vector<vector<int>>newmatrix=matrix;
如果不初始化newmatrix ,发生异常:
我认为应该和以下代码有关:
newmatrix[j][m-i-1]=matrix[i][j];
放入到newmatrix 时放入到了边界外(_m_end())的空间。、
面试题 01.01. 判定字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
解1:辅助空间
class Solution {
public:
bool isUnique(string astr) {
unordered_set<char>tmp;
for(auto & x:astr)
{
if(tmp.count(x))
{
return false;
}
tmp.insert(x);
}
return true;
}
};
解法2:
class Solution {
public:
bool isUnique(string astr) {
sort(astr.begin(),astr.end());
char tmp=astr[0];
for(int i=1;i<astr.size();i++)
{
if(astr[i]==tmp)
{
return false;
}
tmp=astr[i];
}
return true;
}
};
解法3:位运算
class Solution {
public:
bool isUnique(string astr) {
int mark=0;
for(auto &x:astr)
{
int move_bit=x-'a';//求出与a的距离。‘a’-'a'=0 1<<0=0001(1)
//‘b’-'a'=1,1<<1=0010(2),就是说每个字符都占一个位。
if(1<<move_bit&mark) //按位与得到不同位上表示不同的bool值
//比如1 1 1 1
// d c b a (这样通过下面的或运算可以得到哪些字符已经存在的bool值汇总。
{
return false;
}
mark|=1<<move_bit;//已存在的字符bool值放入到mark中。
}
return true;
}
};