复试 || 就业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;
    }
};

你可能感兴趣的:(考研,#,机试,力扣(LeetCode),算法,考研,数据结构,力扣,哈希)