力扣题目训练(12)

2024年2月5日力扣题目训练

2024年2月5日第十二天编程训练,今天主要是进行一些题训练,包括简单题3道、中等题2道和困难题1道。惰性太强现在才完成,不过之后我会认真完成的。

476. 数字的补数

链接: 数字的补数
难度: 简单
题目:
题目描述

运行示例:
运行示例

思路:
由题目可知,我们可以将 num二进制表示的每一位取反。因此我们需要首先找到 num二进制表示最高位的那个 1,再将这个 1以及更低的位进行取反。
如果 num 二进制表示最高位的 1 是第 i (0≤i≤30)位,那么一定有:2i≤num<2i+1
因此我们可以使用一次遍历,在 [0,30]中找出 i的值。在这之后,我们就可以遍历 num的第 0∼i个二进制位,将它们依次进行取反。
代码:

class Solution {
   
public:
    int findComplement(int num) {
   
        int highbit = 0;
        for(int i = 1; i < 31; i++){
   
            if(num >= (1 << i)){
   
                highbit = i;
            }else{
   
                break;
            }
        }
        int mask = (highbit == 30 ? 0x7fffffff : (1 << (highbit + 1)) - 1);
        return num ^ mask;
    }
};

482. 密钥格式化

链接: 密钥格式化
难度: 简单
题目:
题目描述

运行示例:
运行示例

思路:
这道题本质就是对原来字符串进行分组,将’ - '分配到每组,主要是遍历。
代码:

class Solution {
   
public:
    string licenseKeyFormatting(string s, int k) {
   
        string res,ans;
        for(int i = 0; i < s.size(); i++){
   
            if(s[i] != '-'){
   
                if(s[i] >= 'a' && s[i] <= 'z'){
   
                    res += s[i]-'a'+'A';
                }else{
   
                    res+= s[i];
                }
            }
        }
        int count = 0;
        for(int i = res.size()-1; i >= 0; i--){
   
            if(count % k == 0 && count != 0){
   
                ans+='-';
            }
            ans+=res[i];
            count++;
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

485. 最大连续 1 的个数

链接: 连续 1 的个数
难度: 简单
题目:
题目描述

运行示例:
运行示例

思路:
这道题是一道比较简单问题,只需遍历一次记录连续1的个数即可。
代码:

class Solution {
   
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
   
        vector<int> dp(nums.size()+1,0);
        int ans = 0;
        for(int i = 1 ; i <= nums.size(); i++){
   
            if(nums[i-1] == 1){
   
                dp[i] = dp[i-1] + 1;
                ans = (ans > dp[i])? ans:dp[i];
            }else{
   
                dp[i] = 0;
            }
        }
        return ans;
    }
};

148. 排序链表

链接: 排序链表
难度: 中等
题目:
题目描述

运行示例:
运行示例

思路:
这道题其实跟147. 对链表进行插入排序类似,我采用了相同方法解决,但很容易超时,所以官方的方法是归并排序完成。
代码:

class Solution {
   
public:
    ListNode* sortList(ListNode* head) {
   
        if(head == NULL) return head;
        ListNode* newhead = new ListNode(0);
        newhead->next = head;
        ListNode* p = head;
        ListNode* curr = head->next;
        while(curr != NULL){
   
            if(p->val <= curr->val){
   
                p = p->next;
            }else{
   
                ListNode* pre = newhead;
                while(pre->next->val <= curr->val) pre = pre->next;
                p->next = curr->next;
                curr->next = pre->next;
                pre->next = curr;
            }
            curr = p->next;
        }
        return newhead->next;
    }
};

164. 最大间距

链接: 最大间距
难度: 中等
题目:
题目描述

运行示例:
运行示例

思路:
这道题就是利用自带的排序函数,之后算差值,不过官方的方法是基数排序,没有利用自带的函数。

代码:

class Solution {
   
public:
    int maximumGap(vector<int>& nums) {
   
        if(nums.size() < 2) return 0;
        sort(nums.begin(),nums.end());
        vector<int> res(nums.size());
        int count = 0;
        for(int i = 1; i < nums.size(); i++){
   
            count = (nums[i]-nums[i-1]) > count ?(nums[i]-nums[i-1]):count;
        }
        return count;
    }
};

84. 柱状图中最大的矩形

链接: 最大的矩形
难度: 困难
题目:
题目描述

运行示例:
运行示例

思路:
这道题我知道是找一根柱子的左侧且最近的小于其高度的柱子,但我不太懂如何利用栈完成这道题。
官方解法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

class Solution {
   
public:
    int largestRectangleArea(vector<int>& heights) {
   
        int n = heights.size();
        if(n == 0) return 0;
        vector<int> left(n),right(n);
        stack<int> st;
        for(int i = 0; i < n; i++){
   
            while(!st.empty() && heights[st.top()] >= heights[i]){
   
                st.pop();
            }
            left[i] = (st.empty()? -1:st.top());
            st.push(i);
        }
        st = stack<int>();
        for(int i = n -1; i >= 0; i--){
   
            while(!st.empty() && heights[st.top()] >= heights[i]){
   
                st.pop();
            }
            right[i] = (st.empty()? n:st.top());
            st.push(i);
        }
        int ans = 0;
        for (int i = 0; i < n; ++i) {
   
            ans = max(ans, (right[i] - left[i] - 1) * heights[i]);
        }
        return ans;
    }
};
       

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-18 13:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-18 13:40:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-18 13:40:04       82 阅读
  4. Python语言-面向对象

    2024-02-18 13:40:04       91 阅读

热门阅读

  1. react中commit工作流程

    2024-02-18 13:40:04       52 阅读
  2. 【编程】Rust语言入门第4篇 字符串

    2024-02-18 13:40:04       51 阅读
  3. React中hooks使用限制及保存函数组件状态

    2024-02-18 13:40:04       49 阅读
  4. Rust 学习笔记 - 流程控制 与 Range 类型

    2024-02-18 13:40:04       53 阅读
  5. AWS认证SAA-C03每日一题

    2024-02-18 13:40:04       42 阅读
  6. https 为什么安全

    2024-02-18 13:40:04       58 阅读
  7. CDF和PDF的比较

    2024-02-18 13:40:04       45 阅读