复试 || 就业day02(2023.12.28)算法篇

前言

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

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

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

罗马数字转整数


题目链接:罗马数字转整数

C++版AC代码:

class Solution {
   
public:
    int romanToInt(string s) {
   
        unordered_map<char, int> m;
        m['I'] = 1, m['V'] = 5, m['X'] = 10, m['L'] = 50, m['C'] = 100, m['D'] = 500, m['M'] = 1000;
        int ans = 0;
        for (int i = 0; i < s.size(); i ++ ){
   
            if (s[i] != 'I' && s[i] != 'X' && s[i] != 'C') ans += m[s[i]];
            else if (i == s.size() - 1) ans += m[s[i]];
            else{
   
                if (s[i] == 'I' && (s[i + 1] == 'V' || s[i + 1] == 'X')) 
                    ans += m[s[i + 1]] - m[s[i]], i ++;
                else if (s[i] == 'X' && (s[i + 1] == 'L' || s[i + 1] == 'C')) 
                    ans += m[s[i + 1]] - m[s[i]], i ++;
                else if (s[i] == 'C' && (s[i + 1] == 'D' || s[i + 1] == 'M')) 
                    ans += m[s[i + 1]] - m[s[i]], i ++;
                else ans += m[s[i]];
            }
        }
        return ans;
    }
};

环形链表


题目链接:环形链表

C++版AC代码:

快慢指针

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
   
public:
    bool hasCycle(ListNode *head) {
   
        ListNode *slow = head, *fast = head;
        while (fast){
   
            slow = slow -> next;
            fast = fast -> next;
            if (fast && fast -> next) fast = fast -> next;  // 这里光判fast->next会有空指针错
            else return false;
            if (slow == fast) return true;
        }
        return false;
    }
};

C++版AC代码:

哈希表,存储遍历过的结点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
   
public:
    bool hasCycle(ListNode *head) {
   
        unordered_map<ListNode*, int> m;
        ListNode * p = head;
        while(p){
   
            if (m.find(p) != m.end()) return true;
            m[p] ++;
            p = p -> next;
        }
        return false;
    }
};

相交链表


题目链接:相交链表

C++版AC代码:

双指针

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
   
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
   
        ListNode *l1 = headA, *l2 = headB;
        int len1 = 0, len2 = 0;
        while (l1) l1 = l1 -> next, len1 ++;
        while (l2) l2 = l2 -> next, len2 ++;
        l1 = headA, l2 = headB;
        if (len1 < len2){
         // 保证l1和len1存储的较长的链
            ListNode *p = l1;
            l1 = l2;
            l2 = p;
            int tmp = len1;
            len1 = len2;
            len2 = tmp;
        }
        int k = len1 - len2;
        while (k -- && l1) l1 = l1 -> next;
        while (l1){
   
            if (l1 == l2) return l1;
            l1 = l1 -> next;
            l2 = l2 -> next;
        }
        return NULL;
    }
};

C++版AC代码:

哈希表,先遍历一轮链表A,把A中的所有元素加入哈希表,然后遍历链表B,对于每一个结点去查是否在哈希表中,查到的第一个结点就是第一个公共结点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
   
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
   
        unordered_map<ListNode*, int> m;
        ListNode *p = headA;
        while (p) m[p] ++, p = p -> next;
        p = headB;
        while (p){
   
            if (m.find(p) != m.end()) return p;
            p = p -> next;
        }
        return NULL;
    }
};

多数元素


题目链接:多数元素

C++版AC代码:

经典的投票算法

class Solution {
   
public:
    int majorityElement(vector<int>& nums) {
   
        int data = nums[0];
        int cnt = 1;
        for (int i = 1; i < nums.size(); i ++ ){
   
            if (nums[i] == data) cnt ++;
            else{
   
                cnt --;
                if (cnt == 0){
   
                    cnt = 1;
                    data = nums[i];
                }
            }
        }
        return data;
    }
};

快乐数


题目链接:快乐数

C++版AC代码:

三种情况:
1.不断地循环最终发现是快乐数
2.不断地循环(该数不是快乐数)那么必定会有死循环(如果把每次出现的数拉成一个链表,则必定有环)可用哈希
3.不断地循环(该数不是快乐数)超出最大范围,易知本题不存在这种情况(不可能循环到正无穷)

class Solution {
   
public:
    bool isHappy(int n) {
   
        unordered_map<int, int> m;
        while (n != 1){
   
            int tmp = n, num = 0;
            while (tmp){
   
                int d = tmp % 10;
                num += d * d;
                tmp /= 10;
            }
            n = num;
            if (m.find(num) != m.end()) return false;
            m[num] = 1;
        }
        return true;
    }
};

相关推荐

  1. 复试 || 就业day01(2023.12.27)算法

    2023-12-29 06:10:04       28 阅读
  2. 复试 || 就业day02(2023.12.28)算法

    2023-12-29 06:10:04       48 阅读
  3. 复试 || 就业day06(2024.01.01)算法

    2023-12-29 06:10:04       41 阅读
  4. 复试 || 就业day09(2024.01.04)算法

    2023-12-29 06:10:04       39 阅读
  5. 复试 || 就业day11(2024.01.07)算法

    2023-12-29 06:10:04       33 阅读
  6. 复试 || 就业day12(2024.01.08)算法

    2023-12-29 06:10:04       46 阅读
  7. 复试 || 就业day13(2024.01.09)算法

    2023-12-29 06:10:04       34 阅读
  8. 复试 || 就业day15(2024.01.13)算法

    2023-12-29 06:10:04       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 06:10:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 06:10:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 06:10:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 06:10:04       18 阅读

热门阅读

  1. C#/WPF 以管理员身份运行程序

    2023-12-29 06:10:04       42 阅读
  2. c++ - 函数的模板特化

    2023-12-29 06:10:04       42 阅读
  3. 不浪费原料的汉堡制作方案(LeetCode日记)

    2023-12-29 06:10:04       33 阅读
  4. Leetcode-230.二叉搜索树中第k小的元素(Python)

    2023-12-29 06:10:04       40 阅读
  5. Zeppelin安装教程

    2023-12-29 06:10:04       33 阅读
  6. 使用pandas绘图,并保存,支持中文

    2023-12-29 06:10:04       30 阅读