额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

news2024/9/24 13:24:53

1365 暴力解法也能过

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> result(nums.size(), 0);
        for (int i=0; i<nums.size(); i++) {
            int count =0;
            for (int j=0; j<nums.size(); j++) {
                if (nums[j]<nums[i]) count++;
            }
            result[i]=count;
        }
        return result;
    }
}; 

优化 看了代码随想录的思路 其实本来自己想到了要sort就可以 但是没想到用一个hash来对应数值和数组中比他小的个数 填充hash时从后往前 这样相等的数值就会被覆盖成最前面的 

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> sorted = nums;
        sort(sorted.begin(), sorted.end());

        int hash[105] = {};
        for (int i=sorted.size()-1; i>=0; i--) {
            hash[sorted[i]]=i;
        }

        vector<int> result(nums.size(), 0);
        for (int i=0; i<nums.size(); i++) {
            result[i]=hash[nums[i]];
        }
        return result;
    }
};

941 我是按照顺序来遍历找山峰的 但这个逻辑确实是比较容易有所疏漏 所以第一次提交的时候忽略了单调递减这个情况 错误判断成了true

class Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        if (arr.size()<3) {
            return false;
        }
        int i=1;
        while (i<arr.size() && arr[i]>arr[i-1]) {
            i++;
        }
        if (i>=arr.size() || arr[i]==arr[i-1] || i==1) {
            return false;
        }
        while (i<arr.size() && arr[i]<arr[i-1]) {
            i++;
        }
        if (i>=arr.size()) {
            return true;
        }
        return false;
    }
};

用双指针来写更加清晰且不易错 让i和j从两边单调递增到山峰 最后的i和j应该是会合且不在数组头尾 其他情况都return false

lass Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        if (arr.size()<3) return false;
        int i=1;
        int j= arr.size()-2;
        while (i<arr.size() && arr[i]>arr[i-1]) i++;
        while (j>=0 && arr[j]>arr[j+1]) j--;
        i--; j++;
        if (i!=j || i==0 || j==arr.size()-1) return false;
        return true;
    }
};

1207 典型哈希表题目 出现的元素范围是-1000到1000 所以定义数组hash数出元素出现的个数 之后遍历整个hash数组 再映射到existed数组 如果hash数组的值>0则记为出现过 如果遍历到出现过的个数就return false

下面comment的是我自己想的用umap来写的 就是把每个次数map到第一个元素出现这么多次数的数上面去 遍历arr数组 通过hash值在map里找这个次数 如果找到就说明前面有过相同次数 return false

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        int hash[2001]={0};
        for (int i=0; i<arr.size(); i++) {
            hash[arr[i]+1000]++;
        }

        bool existed[2001]={false};
        for (int i=0; i<2000; i++) {
            if (existed[hash[i]]==true) return false;
            if (hash[i]>0) existed[hash[i]]=true;
        }
        return true;
        
        /* unordered_map<int, int> umap;
        for (int i=0; i<arr.size(); i++) {
            if (umap.find(hash[arr[i]+1000])==umap.end()) {
                umap[hash[arr[i]+1000]] = arr[i]+1000;
            }
            else {
                if (umap[hash[arr[i]+1000]] == arr[i]+1000) continue;
                else return false;
            }
        }
        return true; */
    }
};

 283 这个是我自己想的! 每次从头找第一个零 与他后面第一个非0交换位置 直到两个while loop任意一个到数组末尾为止

class Solution {
private:
    void swap(vector<int>& nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
public:
    void moveZeroes(vector<int>& nums) {
        while (true) {
            int i=0; 
            while (i<nums.size() && nums[i]!=0) i++;
            if (i==nums.size()) return;
            int j=i+1;
            while (j<nums.size() && nums[j]==0) j++;
            if (j==nums.size()) return;
            swap(nums,i,j);
        }
        return;
    }
};

这个思路是参考代码随想录之后写的 双指针法效率感觉更高!如果忘记思路了可以再去看一下那个动图 总结来说就是slow指针是一个一个走的 fast碰到有0的就跳过 每次让nums[slow]=nums[fast] 当fast走到末尾的时候 从slow现在的位置到末尾都赋值0

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slow=0;
        int fast=0;
        while(fast<nums.size()) {
            while (fast<nums.size() && nums[fast]==0) fast++;    
            if (fast==nums.size()) break;
            nums[slow]=nums[fast];
            slow++;
            fast++;
        }
        while (slow<nums.size()) {
            nums[slow++]=0;
        }
    }
};

189 double数组之后再赋值就可以!注意旋转方向

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k=k%nums.size();
        vector<int> double_nums(2*nums.size(),0);
        for (int i=0; i<double_nums.size(); i++) {
            double_nums[i] = nums[i%nums.size()];
        }
        for (int i=0; i<nums.size(); i++) {
            nums[i]=double_nums[i+nums.size()-k];
        }
    }
};

method 2 先反转整个数组 再反转前k个和后面的(这是向右轮转)

--diff 向右转就是前k个 向左转是后k个

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        //method 2
        k=k%nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin()+k);
        reverse(nums.begin()+k, nums.end());
    }
};

 724 本来想用双指针做 但因为数组里会有负数所以还是用动态规划来做比较好 (其实这里的left和right不需要是数组 是variable就可以了 每次覆盖就ok

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        vector<int> left(nums.size(), 0);
        vector<int> right(nums.size(),0);
        left[0]=0;
        for (int i=1; i<nums.size(); i++) {
            right[0]+=nums[i];
        }

        if (left[0]==right[0]) return 0;
        for (int i=1;i<nums.size(); i++) {
            left[i]=left[i-1]+nums[i-1];
            right[i]=right[i-1]-nums[i];
            if (left[i]==right[i]) return i;
        }
        
        return -1;
    }
};

34 二分查找题 一定一定要记得是什么区间 这里是左闭右闭 所以更新mid的时候是left=mid+1 or right = mid-1 才能终止while loop

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left = 0; 
        int right = nums.size()-1; 
        int mid=0;
        while (left<=right) {
            mid = (left+right)/2;
            if (nums[mid]==target) break;
            if (nums[mid]>target) right=mid-1;
            else if (nums[mid]<target) left=mid+1;
        }

        vector<int> result = {-1,-1};
        if (nums.size() == 0 || nums[mid]!=target) return result;

        int first=mid; int last=mid;
        while (first>=0 && nums[first]==target) first--;
        first++;
        while (last<nums.size() && nums[last]==target) last++;
        last--;

        result[0]=first; result[1]=last;
        return result;
    }
};

922 双指针法 i指向偶数位 j指向奇数位 遇到合格的就跳过 两个都是不合格的就互换位置 一直到任意一个遍历完整个数组位置

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int i=0;
        int j=1;
        while (i<nums.size() && j<nums.size()) {
            while (i<nums.size() && nums[i]%2==0) i=i+2;
            while (j<nums.size() && nums[j]%2==1) j=j+2;
            if (i>=nums.size() || j>=nums.size()) break;
            int temp = nums[i];
            nums[i]=nums[j];
            nums[j]=temp;
        }
        return nums;
    }
};

35 二分查找经典模版 但return的时候要判断一下是放在mid前面还是后面

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0; int right = nums.size()-1;
        int mid=0;
        while (left<=right) {
            mid = (left+right)/2;
            cout<<"mid = "<<mid<<endl;
            if (target==nums[mid]) return mid;
            if (target>nums[mid]) left = mid+1;
            else if (target<nums[mid]) right=mid-1;
        }
        if (nums[mid]>target) return mid;
        return mid+1;
    }
};

24 记得加dummy_head会好写一点 要单独考虑特殊情况 用curr来遍历整个链表

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummy_head = new ListNode(0, head);
        ListNode* curr = dummy_head;
        while (curr!=nullptr) {
            ListNode* temp = curr->next;
            if (temp==nullptr || temp->next == nullptr) break;
            ListNode* temp1 = temp->next->next;
            curr->next = temp->next;
            curr->next->next = temp;
            temp->next = temp1;
            curr = curr->next->next;
        }
        return dummy_head->next;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

互联网时代,企业经营管理面临的挑战有哪些?

随着科学技术的进步和社会经济的发展&#xff0c;大数据已经被应用到各个行业领域中&#xff0c;尤其在企业经营管理方面。通过对企业内部数据信息的利用&#xff0c;企业内部经营管理能力得到提升&#xff0c;那么在大数据时代&#xff0c;企业经营管理面临的挑战有哪些呢&…

C/C++几个关键知识点记录

1.将一个数值作为函数执行 (*(void(*)())0x13)();同理也可以将数值换成一个变量&#xff1a; int var0x13; (*(void(*)())var)();2.断言assert 用于判断输入的参数是否正确&#xff0c;实际就是判断输入的参数是否为0&#xff0c;如STM32的固件库中常用的assert_param()&…

Ceph入门到精通- Linux 磁盘管理(block 与 inode)

1 硬盘 block 与 inode 详解 1.1 Sector&#xff08;扇区&#xff09;与 Block&#xff08;块&#xff09; 1&#xff09; 硬盘的最小存储单位&#xff1a;sector&#xff08;扇区&#xff09;&#xff0c;每个扇区储存 512 字节&#xff1b;操作系统会一次性连续读取多个…

抖音短视频seo矩阵系统源码开发部署技术分享

抖音短视频的SEO矩阵系统是一个非常重要的部分&#xff0c;它可以帮助视频更好地被搜索引擎识别和推荐。以下是一些关于开发和部署抖音短视频SEO矩阵系统的技术分享&#xff1a; 一、 抖音短视频SEO矩阵系统的技术分享&#xff1a; 关键词研究&#xff1a;在开发抖音短视频SEO矩…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头。

✍️作者简介&#xff1a;沫小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北 CSDN、51cto博客、稀土掘金、简书、知乎、开源中国、博客园、慕课网 &#x1f310;系列专栏&#xff1a;码农小北 &#x1f514;如果文…

防止连点..

1.连点js文件 let timer; letflag /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次** param {Function} func 要执行的回调函数* param {Number} wait 延时的时间* param {Boolean} immediate 是否立即执行* return null*/ function throttle(func, wait 500…

[Java] 单例设计模式详解

模式定义&#xff1a;保证一个类只有一个实例&#xff0c;并且提供一个全局访问点&#xff0c;时一种创建型模式 使用场景&#xff1a;重量级的对象&#xff0c;不需要多个实例&#xff0c;如线程池&#xff0c;数据库连接池 单例设计模式的实现 1.懒汉模式&#xff1a;延迟…

牛客上面的约瑟夫环问题

对于本题 我感觉还是链表做起来舒服 数组也可以做 但是数组需要去控制循环 不太好控制 我之前搞了 最后看别人的实现 但是链表搞了一次就搞好了 香的嘞~ 下面是代码 用单链表实现循环 再去删除要删除的人 5个人 数到2 你们在纸上画图 我就不画了 对于数组实现你们可以去…

python读取json文件

import json# 文件路径(同目录文件名即可,不同目录需要绝对路径) path 1.json# 读取JSON文件 with open(path, r, encodingutf-8) as file:data json.load(file)#data为字典 print(data) print(type(data))

前端Vue入门-day03-用Vue实现工程化、组件化开发

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 生命周期 Vue 生命周期 和 生命周期的四个阶段 Vue 生命周期函数&#xff08;钩子函数&#xff09; 案例…

为公网远程访问树莓派配置一个固定TCP地址

今天我们就为大家介绍&#xff0c;如何设置cpolar&#xff0c;为树莓派的SSH构建一个永久固定TCP地址。 如果看过我们之前的文章介绍&#xff0c;就会很轻易的发现&#xff0c;能够让公共互联网通过SSH访问树莓派的关键&#xff0c;是cpolar打通的数据隧道&#xff0c;因此想要…

【双指针优化DP】The 2022 Hangzhou Normal U Summer Trials H

Problem - H - Codeforces 题意&#xff1a; 思路&#xff1a; 首先很明显是DP 因为只有1e6个站点&#xff0c;因此可以以站点作为阶段 注意到K很小&#xff0c;因此可以尝试把这个当作第二维 设dp[i][j]为到达第i个站点&#xff0c;已经花了j元钱的最小步数 然后就想了一…

Redis持久化机制 RDB、AOF、混合持久化详解!如何选择?| JavaGuide

本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。) Redis 持久化机制属于后端面试超高频的面试知识点,老生常谈了,需要重点花时间掌握。即使不是准备面试,日常开发也是需要经常用到的。 最近抽空对之前写的 Redis 持久化…

18 张图,总结 Java 容器化的最佳实践~

一、系统选择 关于最基础的底层镜像, 通常大多数我们只有三种选择: Alpine、Debian、CentOS; 这三者中对于运维最熟悉的一般为 CentOS, 但是很不幸的是 CentOS 后续已经不存在稳定版, 关于它的稳定性问题一直是个谜一样的问题; 这是一个仁者见仁智者见智的问题, 我个人习惯是能…

RunnerGo:详细使用教程,带你轻松拿捏性能测试

RunnerGo简介&#xff1a; RunnerGo是基于go语言开发的轻量级性能测试平台&#xff0c;支持接口测试、自动化测试、性能测试等3大测试模块&#xff0c;相对于传统的性能测试工具&#xff0c;它具有运行速度快、资源占用少等特点。并且还支持可实时查看性能测试报告的平台 Run…

mybatisplus入门教程

mybatisplus入门教程 文章目录 mybatisplus入门教程什么是Mybatis Plus快速入门创建数据库 gk_mybatis_plus创建数据库表添加数据创建空的Spring Boot项目添加依赖配置数据库连接MySQL编写代码实体类 GkUserDomainmapperxml映射文件业务层&#xff0c;实现类控制层创建请求配置…

Vue2基础八、插槽

零、文章目录 Vue2基础八、插槽 1、插槽 &#xff08;1&#xff09;默认插槽 作用&#xff1a;让组件内部的一些 结构 支持 自定义需求: 将需要多次显示的对话框, 封装成一个组件问题&#xff1a;组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。…

Redission分布式锁详解

前言 ​ 在分布式系统中&#xff0c;当不同进程或线程一起访问共享资源时&#xff0c;会造成资源争抢&#xff0c;如果不加以控制的话&#xff0c;就会引发程序错乱。而分布式锁它采用了一种互斥机制来防止线程或进程间相互干扰&#xff0c;从而保证了数据的一致性。 常见的分…

【低代码】对低代码未来发展方向的思考

写在前面 看似不起波澜&#xff0c;日复一日的努力&#xff0c;会突然在某一天&#xff0c;让你看到坚持的意义。 1 基础介绍 1.1 什么是低代码 低代码开发是一种软件开发方法&#xff0c;它允许开发人员使用图形界面和少量代码来快速构建应用程序。开发人员可以使用预定义的…

Docker 之 Consul容器服务更新与发现

一、Consul介绍 1、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff…