程序员面试题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的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试金典面试题 01.08. 零矩阵

程序员面试金典面试题 08.01. 三步问题

Java工程师面试题,二级java刷题软件

边做算法边学go语言之程序员面试金典面试题 01.06. 字符串压缩

Java进阶之光!2021必看-Java高级面试题总结

面试题 01.02. 判定是否互为字符重排