【leecode 面试题01.07旋转矩阵、 面试题 01.01. 判定字符是否唯一】

面试题 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;
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值