《剑指offer》第2章 03-15题解_剑指offer第二章-程序员宅基地

技术标签: 算法  C++  c++  数据结构  

第二章 面试需要的基础知识

1. 数组

剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 
  • 排序后扫描复杂度O(nlogn)

  • 哈希表,空间复杂度O(n),时间复杂度O(n)

    原地哈希:有的元素多次重复,有的元素确实,使用原地哈希,其中某个正确元素一定在合适位置,那么遍历时每次比较当前元素是否与 合适位置重复,如果没有重复,就把它放到合适位置。

    时间复杂度O(n),空间复杂度O(1)

    int findRepeatNumber(vector<int>& nums) {
        for(int i = 0;i < nums.size(); ++i){//从头到尾扫描
            if(nums[i] == i) continue;//如果nums[i]在合适的位置,继续向前扫描
            else{//如果不在合适位置
                if(nums[i] == nums[ nums[i] ]) return nums[i];//比较当前元素是否与合适位置的元素重复
                else swap(nums[i],nums[nums[i]]);//如果不重复,就把当前元素放到合适位置
            }
        }
        return 0;
    }
变形题:不修改数组找出重复数字
  1. 创建一个长度为n+1的辅助数组,逐一把原数组的元素m复制到新数组对应下标为m的位置,如果该位置已经被修改,那么该数字重复。空间复杂度O(n)。
  2. 二分法:以0 ~ n-1的中点m为界,小于m的数如果超过了m个,则说明前m个数中有重复的,相反则证明后m个数有重复。再以0~m-1为界,继续缩小范围,继续缩小范围,则能找到该重复的数。空间复杂度为O(1),时间复杂度为O(nlogn)。以时间换空间。
剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

现有矩阵 matrix 如下:
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。给定 target = 20,返回 false。

**解决一个复杂问题,通过分析简单具体的例子,试图寻找普遍规律。**发现从右上角开始分析作为突破口。

//从右上角遍历,比target小,就向下走,比target大,就往左走
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.empty()) return false;
        int n = matrix.size(),m = matrix[0].size();
        int i = 0,j = m-1;
        while(i < n && j >= 0){
            if(matrix[i][j] == target) return true;
            else if(matrix[i][j] < target){
                ++i;
            }else{
                --j;
            }
        }
        return false;
    }

2. 字符串

每个字符串都以字符‘\0’结尾,所以要注意越界。

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

输入:s = "We are happy."
输出:"We%20are%20happy."
  • 第一种:在原来字符的基础上进行修改,那么就有可能覆盖修改该字符后面的内容。所以需要把空格后面的所有字符都后移2字节。因为每个空格后面的所有字符都要移动,所以时间复杂度是O(n^2)
  • 第二种:创建一个新的足够多的字符串,在新的字符串上进行复制。建立双指针从后往前,旧指针指向旧字符串末尾,新指针指向新字符串末尾,碰到空格,旧指针-1,新指针-3;碰到字符,将对应字符复制到新字符串处。

是否高度警惕内存覆盖

    string replaceSpace(string str) {
        if(str.empty()) return "";
        int count = 0;//统计空格的个数
        for(auto & s:str){
            if(s == ' ') ++count;
        }
        int last = str.size()-1,newlast = str.size()+2*count-1;//last指向原数组末尾,newlast指向新数组末尾
        stri
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ClaireSy/article/details/117081200

智能推荐

蒲慕明:今人眼中的大脑之美 | 书评-程序员宅基地

文章浏览阅读214次。圣地亚哥·拉蒙-卡哈尔(Santiago Ramón y Cajal, 1852-1934)来源:知识分子撰文:蒲慕明现代神经科学起源于十九世纪末期;圣地亚哥·拉蒙-卡哈尔(Santi..._蒲慕明人怎么样

python 3.9啥时候出来_Python 3.9的到来到底是意味着什么?本文详细给你讲述!-程序员宅基地

文章浏览阅读38次。本文主要介绍Python3.9的一些新特性,如:更快速的进程释放,性能的提升,简便的新字符串函数,字典并集运算符以及更兼容稳定的内部API,详细如下:字典并集和可迭代更新字符串方法类型提示新的数学函数新的解析器IPv6范围内的地址新模块:区域信息其他语言更改1、字典并集和可迭代更新Python 3.9 dict类。如果有两个字典a和b,则现在可以使用这些运算符进行合并和更新。我们有合并运算符|:使..._python3.9.6什么时候发布的

【QT+QGIS跨平台编译】017:【zlib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)-程序员宅基地

文章浏览阅读512次,点赞6次,收藏7次。通过一套zlib代码和框架,实现zlib跨平台编译。在Qt环境下,集成zlib库的头文件、库文件,构建跨平台编译的pro文件。通过构建的一套配置工程,基于Qt Creator IDE,完成跨平台编译实践。在Windows、Linux、MacOS等操作系统上进行测试,成功编译,形成的成果(头文件、库文件等)可在不同系统下调用或使用,从而更好地构建跨平台解决方案。采用的是zlib 1.2.12版本。读者可参考博客中的集成原理和pro文件,构建不同版本的zlib跨平台包。

Qt Quick里的图形效果(Graphical Effects)_qt graphical effects-程序员宅基地

文章浏览阅读1.7w次,点赞4次,收藏31次。Graphical Effects ,姑且叫作图形效果吧。它提供了 Blend 、 Color 等好几类效果,有些类别下面又有多种不同的效果……在界面引入图形效果,能够让我们的UI更具吸引力……_qt graphical effects

360 android系统 流量,警惕天价流量费 360手机卫士Android版增流量监控-程序员宅基地

文章浏览阅读540次。目前,随着Android手机系统大热,低价智能手机越来越普及,而智能机最大的特点就是软件丰富和可随时随地可以上网。地铁里发微博,看新闻甚至看视频都成为很多朋友的一大爱好。但是,也有不少初次使用智能手机的菜鸟经常遇到电话费暴涨的问题,自己的所订制的套餐不知不觉就已耗尽,手机流量,就像一笔糊涂账,算也算不清楚。其实,统计手机上网流量的应用程序也有不少,但大多都是只能让你“死个明白”,功能单一,缺乏拦截..._360手机卫士 大量流量

腾讯技术运维岗实习面试_腾讯 安全技术 面试-程序员宅基地

文章浏览阅读5.6k次,点赞2次,收藏13次。 腾讯的技术运营实习面试已过去半个月了,前段时间一直在忙着华为软件大赛和之后的网络技术大赛,没来得及及时总结与反思,在得知进了网络大赛的复赛后,一边准备复赛,一边写写前面面试的经历。 4.11日下午收到腾讯12号的面试复试通知,没有时间准备,期间华为杯软件大赛的也快到了提交时间,结果也没做出了,我把 重心放在比赛上了,参加腾讯面试只是抱着试一试的态度。 4.12日下午初面:在酒店..._腾讯 安全技术 面试

随便推点

求解二阶偏微分方程c语言,科学网—求解偏微分方程开源有限元软件deal.II学习--Step 3 - 亓欣波的博文...-程序员宅基地

文章浏览阅读679次。完整版见:qixinbo.info.deal.II的程序结构deal.II采用面向对象编程,其中包含了很多的Modules,各自实现不同的功能,并有机地结合起来。如上图所示。具体为:TriangulationTriangulations是单元及其更低维度的边界的集合。triangulation存储了网格的几何和拓扑性质:单元怎样接触,它们的顶点在哪里。triangulation不知道将要在它上面使..._c语言二阶微分运算

turtlebot技术参数_turtlebot 加速度-程序员宅基地

文章浏览阅读1.9k次。turtlebot2的IMU只有陀螺仪,没有加速度计。但是还好有编码器提供里程计信息。它们的技术参数如下:(参考)1.陀螺仪Kobuki硬件入门教程-陀螺仪 说明: 介绍陀螺仪的相关信息 规范 3轴数字陀螺仪 制造商:STMicroelectronics 部件名称:L3G4200D 测量范围:±250度/秒 偏航轴在出厂时在±20度/秒至±100度/秒的范围内校准2.里程计(参考)M_turtlebot 加速度

探索未来网络: Gaio - 高性能、异步IO框架-程序员宅基地

文章浏览阅读347次,点赞3次,收藏10次。探索未来网络: Gaio - 高性能、异步IO框架项目地址:https://gitcode.com/xtaci/gaio项目简介GitCode上的Gaio 是一个由xtaci开发的基于Python的高性能、异步I/O框架。它的设计目标是提供一种简单而强大的方式,用于构建高效的网络应用,特别是在处理大量并发连接时。Gaio利用了Python 3.7及更高版本中的asyncio库,并采用了非阻塞...

Vue项目上线后关闭chroma的vue-devtools调试工具_devtools 调试模式,取消调试模式-程序员宅基地

文章浏览阅读247次。【代码】Vue项目上线后关闭chroma的vue-devtools调试工具。_devtools 调试模式,取消调试模式

JVM内存模型_gvm内存模型-程序员宅基地

文章浏览阅读1.8w次,点赞11次,收藏103次。Java在诞生之初就提出了"Write once,Run Anywhere"的口号,而这些都得益于JVM(Java Vritual Machine),可以提前在不同的运行环境(linux或windows等)上安装JDK之后,就可以让同一份代码在任何地方运行了。而这里的JDK(Java Development Kit)是Java语言、Java虚拟机和Java类库的统称。一、JDK体系结构与Java跨平台特性1.1 JDK体系结构JDK是一个非常庞大的体系,里面包含了JVM、Java SE API(核心类_gvm内存模型

2018最完整JAVA全套课程_java课程2t-程序员宅基地

文章浏览阅读579次。全套JAVA全套课程下载地址:百度网盘_java课程2t

推荐文章

热门文章

相关标签