【复习《剑指Offer》1-5题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第六天 6/50

news2024/12/24 8:33:17

专注 效率 记忆
预习 笔记 复习 做题

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458

本题出自 acwing网站
这个系列是免费的
打卡即刻退回费用。

第六天【剑指Offer例题代码 系列】

    • 1. 找出数组中重复的数字
        • 普通思路
        • 优化思路
    • 2. 不修改数组找出重复的数字
        • 两个错误的普通思路
        • 普通方法(双重循环)
        • 优化方法(优化循环次数,减去一下不需要循环的数据)
    • 3. 二维数组中的查找
        • 普通思路
        • 精彩思路
    • 4. 替换空格
        • 简单题,遍历字符串可以用for(auto : )
    • 5. 从尾到头打印链表
        • 本题考点

今天复习前5题
要求:每道题都要手写出来

1. 找出数组中重复的数字

原题链接

在这里插入图片描述

普通思路

我想的是创建一个数组,大小为1010个
然后遍历一遍数组,记录数据出现的个数,如果个数超过1,那么就是重复数据

时间复杂度O(n*logn) 也就是排序的时间复杂度

优化思路

由于本题给了一个限制
所有数据,一定在 0-n-1 之间

也就是比如n是5
最偏激出现的可能就是

0 1 2 3 4 这样的数据
但凡出现一个重复的
那么就是

0 0 1 2 3
问题来了

如何简便的找出重复数据呢?

我们可以这样

比如所给样例为
3 2 1 0 0
第一个数据是3

3 2 1 0 0
i

0 2 1 3 0
i
当把i所指的元素替换成自己角标的数值

0 2 1 3 0
i
0 1 2 3 0
i
0 1 2 3 0
i
此时再替换就出现重复
因为0位置上已经有0

这个思路归结于
所有的数据大小在 0 - n-1 之间

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int n = nums.size();
        for (auto x : nums)
            if (x < 0 || x >= n)
                return -1;
        for (int i = 0; i < n; i ++ ) {
            while (nums[nums[i]] != nums[i]) swap(nums[i], nums[nums[i]]);
            if (nums[i] != i) return nums[i];
        }
        return -1;
    }
};

2. 不修改数组找出重复的数字

原题链接

在这里插入图片描述

两个错误的普通思路

错误1(空间复杂度不满足)

  1. 创建一个1010大小的数组A
  2. 遍历原数组
  3. ++A[nums[i]]
  4. 如果A[nums[i]] > 1那么说明重复

错误2(改变了原数组)

  1. 给原数组从小到大排序
  2. 然后遍历每每相邻的两个元素,看其是否相等.
  3. 因为重复的元素一定相等,一定挨着

普通方法(双重循环)

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

优化方法(优化循环次数,减去一下不需要循环的数据)

由于所给数据范围是1-n
而数据的长度是n+1
所以一定会出现重复数据的

这种类型题,学过抽屉原理的,应该会明白这道题可以用抽屉原理思考,
关于抽屉原理可以在csdn查一下,就懂了

那么,如何利用抽屉原理思考呢?

在这里插入图片描述
需要注意的一点是
当我们计算出大于mid的个数后

是与n-mid-1的大小进行比较,划分区间(理由是这样才能满足抽屉原理)

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int n = nums.size();
        // cout << n ;
        int l = 1,r = n-1;
        
        while(l<r)
        {
            int mid = (l + r)>> 1;
            int cnt = 0;
            for(auto x:nums)
                if(x>mid)
                    cnt++;
            if(cnt > (n-1-mid))
            {
                l = mid+1;
            }
            else
            {
                r = mid;
            }
        }
        return r;
        
    }
};

3. 二维数组中的查找

原题链接
在这里插入图片描述

普通思路

我的想法是从左上角开始往右下角遍历

但是行不通,

总结就是必须好好观察样例,找到特点规律性质

精彩思路

在这里插入图片描述

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        if (array.empty() || array[0].empty()) return false;
        int i = 0, j = array[0].size() - 1;
        while (i < array.size() && j >= 0) {
            if (array[i][j] == target) return true;
            if (array[i][j] > target) j -- ;
            else i ++ ;
        }
        return false;
    }
};

4. 替换空格

原题链接

简单题,遍历字符串可以用for(auto : )

在这里插入图片描述

class Solution {
public:
    string replaceSpaces(string &str) {
        string end;
        for(auto x:str)
        {
            if(x!=' ')
                end+=x;
            else
                end+="%20";
        }
        return end;
    }
};

5. 从尾到头打印链表

原题链接
在这里插入图片描述

本题考点

  1. 顺序打印链表的掌握(简单)
  2. 数组的翻转reverse
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include<algorithm>

class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
        vector<int> res;
        while (head) {
            res.push_back(head->val);
            head = head->next;
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

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

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

相关文章

第二章:项目环境搭建【基于Servlet+JSP的图书管理系统】

环境搭建 1.项目工具 本项目涉及到的工具都有在云盘提供&#xff0c;自行下载即可 JDK8IDEA2021Tomcat8.5MySQL的客户端工具SQLYog… 2.项目搭建 通过IDEA创建maven项目。勾选脚手架工具。选择maven-archetype-webapp 设置项目的基础信息 3.基本配置 3.1 JDK配置 JDK使用的…

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13108 效果图如下&#xff1a; # cc-serviceDialog 自定义服务说明弹窗 自下而上 底部弹窗 #### 使用方法 使用方法 <!-- 服务…

开发吐槽,谁说测试是二等公民,我们才是好吧

很多测试都认为自己是团队中的二等公民&#xff0c;从而各种看衰作贱自己。 这不&#xff0c;昨天在知乎上就看到一篇帖子&#xff1a;一女测试在团队中各种嘲讽自己的测试团队&#xff0c;“测试是低人一等的职业”&#xff0c;时刻劝说大家转开发。最后团队领导受不了&#…

机器学习:简介与类型

从翻译应用、商品推荐、医疗诊断到自动驾驶汽车&#xff0c;机器学习 (ML) 作为一种技术&#xff0c;都有用武之地。机器学习提供了一种解决问题、回答复杂问题以及创建新内容的新方式。机器学习可以预测天气、估算行程时间、推荐歌曲、自动补全句子、汇总文章以及生成全新的图…

【数据结构】串的基本定义及操作

&#x1f387;[数据结构]串的基本定义及操作&#x1f387; &#x1f308;积薪高于山&#xff0c;焉用先后别 &#x1f308; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;[数据结构]串的基本定义及操作&#x1f387;&…

【运维心得】SAP EPM Add-In加载错误的另类解决方案

关键字&#xff1a;SAP BPC EPM OFFICE WPS 今天又解决了一个诡异的问题&#xff0c;记录一下&#xff0c;以备将来能够用上。 目录 问题现象 网上的方法 启发和解决 结论 问题现象 财务SAP系统需要BPC模块做报表&#xff0c;安装了OfficeEPM Add-In以后&#xff0c;结果…

抖音私域怎么做?

“私域流量”是如今备受市场瞩目的话题之一。众所周知&#xff0c;腾讯、阿里巴巴、抖音等互联网巨头已经开始布局私域资源&#xff0c;因此许多企业都希望在这些平台上获取生意增长。作为具有6亿日活跃用户的短视频平台&#xff0c;抖音也为企业提供了私域运营的阵地。那么&am…

2023年湖北黄冈人社局初、中级职称怎么评?申报条件是什么?启程别

2023年湖北黄冈人社局初、中级职称怎么评&#xff1f;申报条件是什么&#xff1f;启程别 想要评过人社局的初、中级职称&#xff0c;首先要满足申报条件&#xff0c;其次是要准备好申报资料&#xff0c;最后等待申报时间提交资料&#xff0c;等待结果。湖北目前改外全面线上申报…

SAP从入门到放弃系列之BOM技术类型-派生BOM-Part5

文章导航目录 一、概述二、基本概念-BOM技术类型三、BOM技术类型详解3.1、BOM技术类型-简单BOM&多重BOM 3.2、BOM技术类型-派生BOM 四、测试示例&#xff1a;4.1、数据准备4.2、创建派生BOM4.3、调整BOM组&#xff0c;更新派生BOM 一、概述 本来想在介绍BOM组的时候写这个…

hbase协处理器编码实例

Observer协处理器通常在一个特定的事件&#xff08;诸如Get或Put&#xff09;之前或之后发生&#xff0c;相当于RDBMS中的触发器。Endpoint协处理器则类似于RDBMS中的存储过程&#xff0c;因为它可以让你在RegionServer上对数据执行自定义计算&#xff0c;而不是在客户端上执行…

MATLAB 之 对话框设计实例和菜单设计

这里写目录标题 一、对话框设计实例1. 数值转化2. 图形演示 二、菜单设计1. 建立用户菜单2. 菜单对象常用属性3. 快捷菜单 一、对话框设计实例 在上一篇博客当中&#xff0c;我们介绍了控件的基本操作&#xff0c;这是建立对话框的基础。下面我们举两个例子&#xff0c;用以说…

软件测试工程师最常用的Linux系统命令大全(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 cd命令 这是一个…

最新导则下生态环评报告编制技术

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、 10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量…

开窗函数之聚合、取特定值、排名

一&#xff0c; 聚合开窗函数sum(score) over(partition by name ) 二&#xff0c;开窗函数之first_value&#xff0c;last_value&#xff0c;lead&#xff0c;lag 三&#xff0c;排名开窗函数ROW_NUMBER、DENSE_RANK、RANK 一&#xff0c;开窗函数的语法 开窗函数的语法为&am…

Pinia理解【Vue3】

什么是Pinia Pinia是Vue的专属的最新状态管理库&#xff0c;是Vuex状态管理工具的替代品 优势&#xff1a; 提供了更加简单的API (去掉了mutation)提供符合组合式风格的API(和Vue3新语法统一)去掉了 modules 的概念&#xff0c;每一个 store 都是一个独立的模块搭配 TypeScr…

RabbitMQ Exchange类型和工作模式介绍

RabbitMQ Exchange类型和工作模式介绍 一RabbitMQ Exchange类型1.1.Fanout1.2.Direct1.3.Topic1.4.Headers 二 RabbitMQ 工作模式介绍2.1.work工作模式(资源的竞争)2.2.publish/subscribe发布订阅(共享资源)2.3.routing路由模式应用--direct交换器 2.4.topic 主题模式(路由模式…

一键轻松造数据:通过Postman实现表单提交

一、原始需求的诞生 在测试的过程中&#xff0c;需要大量的表单。于是我选择了通过postman发送表单提交的接口来造数据。 如上图所示&#xff0c;表单提交接口所需的参数以及请求体中需模拟的IP地址。参数为 {{}} 的表示需要不同的实参&#xff0c;至于原因就不在这里赘述了。如…

618手机大战:各大品牌花式秀战报,但难掩冷淡行情

在手机出货量持续下行的态势下&#xff0c;各大手机厂商普遍对618这个年中大促寄予厚望&#xff0c;希望通过各种促销手段&#xff0c;扭转销售颓势。 比如&#xff0c;今年5月下旬&#xff0c;小米、荣耀、OPPO、vivo等厂商就已经开启了降价、分期免息等优惠活动&#xff0c;…

Vue3自定义指令实现按钮权限

一、需求前提 登录成功后&#xff0c;后端直接返回了用户的所有权限&#xff08;路由权限按钮权限&#xff09;&#xff0c;在已经实现菜单权限的基础上&#xff0c;实现每个页面的按钮权限&#xff0c;树形数据结构如下&#xff1a; { "roles": ["admin&q…

嵌入式实时操作系统的设计与开发New(六)

aCoral的优先级与数字大小成反比&#xff0c;即&#xff1a;数字越大&#xff0c;优先级越低。 #define MAX_PRIO_NUM ((CFG_MAX_THREAD1) & 0xff) #define MINI_PRIO CFG_MAX_THREAD //最低优先级40typedef enum{ACORAL_INIT_PRIO; //init线程独有的0优先级ACORAL_MAX_PR…