复试 || 就业day05(2023.12.31)算法篇

文章目录

  • 前言
  • 找不同
  • 最长回文串
  • 找到所有数组中消失的数字
  • 下一个更大元素 I
  • 键盘行

前言

你好,我是辰chen,本文旨在准备考研复试或就业
文章题目大多来自于 leetcode,当然也可能来自洛谷或其他刷题平台
欢迎大家的关注,我的博客主要关注于考研408以及AIoT的内容
仅给出C++版代码

以下的几个专栏是本人比较满意的专栏(大部分专栏仍在持续更新),欢迎大家的关注:

ACM-ICPC算法汇总【基础篇】
ACM-ICPC算法汇总【提高篇】
AIoT(人工智能+物联网)
考研
CSP认证考试历年题解

找不同


题目链接:找不同

C++版AC代码:

哈希

class Solution {
public:
    char findTheDifference(string s, string t) {
        unordered_map<char, int> m;
        for (int i = 0; i < s.size(); i ++ ) m[s[i]] ++;
        for (int i = 0; i < t.size(); i ++ ) m[t[i]] --;
        char res;
        for (auto i = m.begin(); i != m.end(); i ++ )
            if (i -> second == -1){
                res = i -> first;
                break;
            }
        return res;
    }
};

C++版AC代码:

题解中一种有趣的解法:累加 t 串的 ASCII,累加 s 串的 ASCII,相减即为多出的字符的 ASCII

class Solution {
public:
    char findTheDifference(string s, string t) {
        int ascii = 0;
        for (int i = 0; i < t.size(); i ++ ) ascii += t[i] - 'a';
        for (int i = 0; i < s.size(); i ++ ) ascii -= s[i] - 'a';
        return 'a' + ascii;
    }
};

最长回文串


题目链接:最长回文串

C++版AC代码:

class Solution {
public:
    int longestPalindrome(string s) {
        unordered_map<char, int> m;
        for (int i = 0; i < s.size(); i ++ ) m[s[i]] ++;
        int res = 0, odd = 0;
        for (auto i = m.begin(); i != m.end(); i ++ ){
            int k = i -> second;
            if (!(k % 2)) res += k;
            else{
                res += k - 1;
                odd = 1;
            }
        }
        return res + odd;
    }
};

找到所有数组中消失的数字


题目链接:找到所有数组中消失的数字

C++版AC代码:

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int> res;
        unordered_map<int, int> m;
        for (int k : nums) m[k] = 1;
        for (int i = 1; i <= nums.size(); i ++ ) 
            if (!m.count(i)) res.push_back(i);
        return res;
    }
};

下一个更大元素 I


题目链接:下一个更大元素 I

C++版AC代码:

单调栈+哈希表,单调栈适用于:求下一个更大的元素;维护一个从栈顶到栈底单调递增的栈,栈顶元素(若存在的话)即为当前元素右边的比他大的第一个元素,因此在构建单调栈的时候需要逆序遍历 nums2,在当前元素 >= st.top() 的时候,需要弹出栈顶的元素直至栈空或栈顶元素大于当前元素。

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> m;
        stack<int> st;
        for (int i = nums2.size() - 1; i >= 0; -- i){
            while (!st.empty() && nums2[i] >= st.top()) 
                st.pop();
            m[nums2[i]] = st.empty() ? -1 : st.top();
            st.push(nums2[i]);
        }
        vector<int> res(nums1.size());
        for (int i = 0; i < nums1.size(); i ++ ) res[i] = m[nums1[i]];
        return res;
    }
};

键盘行


题目链接:键盘行

C++版AC代码:

屎山代码,自己看的都难受,不太想写了,赶紧打个卡而已,祝大家新年快乐!

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        vector<string> res;
        string s0 = "qwertyuiop", s1 = "asdfghjkl", s2 = "zxcvbnm";
        for (auto word : words){
            string tmp = word;
            for (int i = 0; i < word.size(); i ++ ) {
                if (word[i] >= 'A' && word[i] <= 'Z') 
                    word[i] += 32;           // 根据ASCII大写变小写
            }
            bool flag = true;
            int key;
            if (s0.find(word[0]) != -1) key = 0;
            else if (s1.find(word[0]) != -1) key = 1;
            else key = 2;
            for (int i = 1; i < word.size(); i ++ ){
                if (key == 0){                           // 第一行
                    if (s0.find(word[i]) == -1){  
                        flag = false;
                        break;
                    }
                }
                else if (key == 1){                      // 第二行
                    if (s1.find(word[i]) == -1){
                        flag = false;
                        break;
                    }
                }
                else {                                    // 第三行
                    if (s2.find(word[i]) == -1){
                        flag = false;
                        break;
                    }
                }
            }
            if (flag) res.push_back(tmp);
        }
        return res;
    }
};

你可能感兴趣的:(考研,#,机试,力扣(LeetCode),算法,考研,机试,力扣,哈希,c++)