《剑指Offer》模块三 思维题【面试官可能考的13道思维算法题】

思维题

1. 扑克牌的顺子【思维题】

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

1. 判断所有牌中 是否出现 重复

2. 有序sort后 判断是否最大差距 <=4

class Solution {
public:bool isContinuous( vector<int> nums) {sort(nums.begin(), nums.end());for (int i = 1; i < nums.size(); i ++ )if (nums[i] && nums[i] == nums[i - 1])return false;for (auto x : nums)if (x){return nums.back() - x <= 4;}}
};
class Solution {public boolean isContinuous(int[] nums) {int n = nums.length;if (n == 0) return false;Arrays.sort(nums);int k = 0;while (nums[k] == 0) k++;for (int i = k + 1; i < n; i++)if (nums[i] == nums[i - 1])return false;return nums[n - 1] - nums[k] <= 4;}
}

2. 数组中出现次数超过一半的数字

【面试题常考!!!】JZ39 数组中出现次数超过一半的数字【五种方法解决】
原题链接
在这里插入图片描述

class Solution {
public:int moreThanHalfNum_Solution(vector<int>& nums) {int cnt = 0, val = -1;for (auto x : nums)if (x == val)cnt ++ ;else{if (cnt) cnt -- ;else{cnt = 1;val = x;}}return val;}
};
class Solution {public int moreThanHalfNum_Solution(int[] nums) {int cnt = 0;int val = 0;for (int x : nums) {if (cnt == 0) {val = x;cnt++;} else {if (val == x) {cnt++;} else {cnt--;}}}return val;}
}

3. 最小的k个数

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

class Solution {
public:vector<int> getLeastNumbers_Solution(vector<int> input, int k) {sort(input.begin(),input.end());input.erase(input.begin() + k,input.end());return input;}
};
class Solution {public List<Integer> getLeastNumbers_Solution(int [] input, int k) {Arrays.sort(input);List<Integer> ret = new LinkedList();for(int i = 0; i < k; i++){ret.add(input[i]);}return ret;}
}

优先队列

class Solution {public List<Integer> getLeastNumbers_Solution(int [] input, int k) {LinkedList<Integer> res = new LinkedList<>();PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->(b-a));for(int n : input){pq.offer(n);if(pq.size() > k) pq.poll();}while(!pq.isEmpty()){res.addFirst(pq.poll());}return res;}
}

4. 从1到n整数中1出现的次数

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

class Solution {
public:int numberOf1Between1AndN_Solution(int n) {if (!n) return 0;vector<int> number;while (n) number.push_back(n % 10), n /= 10;long long res = 0;for (int i = number.size() - 1; i >= 0; i -- ){int left = 0, right = 0, t = 1;for (int j = number.size() - 1; j > i; j -- ) left = left * 10 + number[j];for (int j = i - 1; j >= 0; j -- ) right = right * 10 + number[j], t *= 10;res += left * t;if (number[i] == 1) res += right + 1;else if (number[i] > 1) res += t;}return res;}
};

5. 数字序列中某一位的数字【数位统计】

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

class Solution {
public:int digitAtIndex(int n) {long long i = 1, s = 9, base = 1;//i表示是几位数,s表示位数共有多少个,base表示位数的起始值。while(n > i * s) {   // 9, 90, 900, 9000, 90000, i * s表示位数总共占多少位。n -= i * s;         // 1000 - 9 - 90 * 2 - 900 * 3 ,当i= 3 时不符合条件,说明是在三位数里面。i ++;                s *= 10;base *= 10;}int number = base + (n + i - 1) / i - 1; //求位数的第几个数, 1000 - 9 - 180 = n , n / 3 + base - 1(考虑0故减1), 向上取整 n + i - 1。int r = n % i ? n % i : i;              // 除不尽就是第几位,除尽力了就是最后一位。for (int j = 0; j < i - r; j ++) number /= 10; //求数的第i - r位,取出第i - r位。return number % 10;}
};

6. 把数组排成最小的数【比较器】

原题链接
在这里插入图片描述
本题
a+b 和 b+a从小到大排序

class Solution {
public:static bool cmp(string a, string b){return a + b < b + a;}string printMinNumber(vector<int>& nums) {vector<string> num_strs;for (auto num : nums) num_strs.push_back(to_string(num));sort(num_strs.begin(), num_strs.end(), cmp);string res;for (auto num : num_strs) res += num;return res;}
};
// import java.util.*;class Solution {static Comparator<Integer> cmp = new Comparator<Integer>() {@Overridepublic int compare(Integer o1,Integer o2) {String s1 = o1+""+o2;String s2 = o2+""+o1;return s1.compareTo(s2);}};public String printMinNumber(int[] nums) {String res = "";Integer[] list = new Integer[nums.length];int n = nums.length;for(int i = 0; i < n; i++){list[i] = nums[i];}Arrays.sort(list,cmp);for(int i = 0; i < n; i++){res += list[i]+"";}return res;}
}

7. 不用加减乘除做加法【二进制 加法】

原题链接

int sum = num1 ^ num2;//不进位的加法

int carry = (num1 & num2)<<1;//进位

在这里插入图片描述

class Solution {
public:int add(int num1, int num2){while(num2!=0){int sum = num1 ^ num2;//不进位的加法int carry = (num1 & num2)<<1;//进位num1 = sum;num2 = carry;}return num1;}
};
class Solution {public int add(int num1, int num2) {while (num2 != 0) {int notCarry = num1 ^ num2;int Carry = (num1 & num2) << 1;num1 = notCarry;num2 = Carry;}return num1;}
}

8. 构建乘积数组

原题链接
在这里插入图片描述
(动归) O(n)
用两个数组left和right,left[i]=A[0]A[1]…*A[i-1], left[i]=A[i-1]*left[i-1]; right[i] = A[i+1]A[i+2]…*A[n-1],则right[i]=A[i+1]*right[i+1]。

最后结果B[i]=left[i]*right[i]。

时间复杂度分析:需要遍历数组,复杂度为O(n)

class Solution {
public:vector<int> multiply(const vector<int>& A) {vector<int>left(A.size(),1);vector<int>right(A.size(),1);for(int i = 1;i<A.size();i++){left[i] = A[i-1]*left[i-1];}for(int i = A.size()-2;i>=0;i--){right[i] = A[i+1]*right[i+1];}vector<int>B(A.size(),0);for(int i = 0;i<A.size();i++){B[i] = left[i]*right[i];}return B;}
};

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

原题链接

在这里插入图片描述

普通思路

我想的是创建一个数组,大小为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;}
};

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

原题链接

在这里插入图片描述

两个错误的普通思路

错误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;}
};

11. 二维数组中的查找

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

普通思路

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

但是行不通,

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

精彩思路

在这里插入图片描述

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;}
};

12. 替换空格

原题链接

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

在这里插入图片描述

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

13. 旋转数组的最小数字

在这里插入图片描述

原题链接

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js使用for of遍历map

//使用for of遍历map console.log("---") console.log(odata.studentDetails) let obj odata.studentDetails[0].answerSituation for(let [key,value] of Object.entries(obj)){console.log(value) }

【业务功能篇73】web系统架构演变-单体-集群-垂直化-服务化-微服务化

1.服务架构的演 1.1 单体架构 单体架构应该是我们最先接触到的架构实现了&#xff0c;在单体架构中使用经典的三层模型&#xff0c;即表现层&#xff0c;业务逻辑层和数据访问层。 单体架构只适合在应用初期&#xff0c;且访问量比较下的情况下使用&#xff0c;优点是性价比很…

淘宝商品优惠券详情item_get_app-获得淘宝app商品详情原数据

item_get_app-获得淘宝app商品详情原数据 taobao.item_get_app 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;调用API接口入口secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09…

Redis系列(三):深入解读Redis主从同步机制

首发博客地址 https://blog.zysicyj.top/ Redis高可靠靠什么保证&#xff1f; 为什么要提这个呢&#xff0c;因为Redis主从库目的呢其实就是为了实现高可靠。上篇文章中我们说过Redis的AOF、RDB日志其实就是为了减少数据丢失&#xff0c;这是高可靠的一部分。 这篇文章呢&#…

C++ STL常用算法(详解)

C常用算法 C sort()排序函数用法详解 C STL 标准库提供有很多实用的排序函数&#xff0c;如表 1 所示。通过调用它们&#xff0c;我们可以很轻松地实现对普通数组或者容器中指定范围内的元素进行排序。 ​ 表 1 C STL 排序函数 函数名用法sort (first, last)对容器或普通数…

C语言学习系列-->【关于qsort函数的详解以及它的模拟实现】

文章目录 一、概述二、qsort函数参数介绍三、qsort实现排序3.1 qsort实现整型数组排序3.2 qsort实现结构体数组排序 四、模拟实现qsort函数 一、概述 对数组的元素进行排序 对数组中由 指向的元素进行排序&#xff0c;每个元素字节长&#xff0c;使用该函数确定顺序。 此函数使…

MES生产报工管理

一、MES生产报工管理的定义与功能&#xff1a; MES生产报工管理是指利用制造执行系统&#xff08;MES&#xff09;对生产过程进行实时监控、数据采集和分析&#xff0c;并及时记录和报告生产工单的实际完成情况。其主要功能包括&#xff1a; 1. 实时数据采集&#xff1a;通过…

【爬虫练习之glidedsky】爬虫-基础2

题目 链接 爬虫往往不能在一个页面里面获取全部想要的数据&#xff0c;需要访问大量的网页才能够完成任务。 这里有一个网站&#xff0c;还是求所有数字的和&#xff0c;只是这次分了1000页。 思路 找到调用接口 可以看到后面有个参数page来控制页码 代码实现 import reques…

通过python在unity里调用C#接口

log: 背景 最近在做虚拟人底层驱动sdk测试&#xff0c;因为后端使用的是C#,我个人更倾向于python编程辅助测试工作&#xff0c;测试sdk需要通过开发提供的接口方法文档&#xff0c;通过传测试场景参数调用方法进行单元测试 技术&工具 项目语言 C# 项目工具 unity 测试…

packge.json中的browserlistrc配置有什么用?

theme: smartblue 前端开发中&#xff0c;需要考虑前端开发中&#xff0c;需要考虑CSS及JS的兼容性&#xff0c;browserlistrc指定了需要兼容的浏览器。 数据来源 Browserslist 的数据都是来自caniuse.com的。 使用方法 package.json {"browserslist": ["l…

大语言模型之四-LlaMA-2从模型到应用

最近开源大语言模型LlaMA-2火出圈&#xff0c;从huggingface的Open LLM Leaderboard开源大语言模型排行榜可以看到LlaMA-2还是非常有潜力的开源商用大语言模型之一&#xff0c;相比InstructGPT&#xff0c;LlaMA-2在数据质量、培训技术、能力评估、安全评估和责任发布方面进行了…

YOLOv5+deepsort实现目标追踪。(附有各种错误解决办法)

一、YOLOv5算法相关配置 🐸这里如果是自己只想跑一跑YOLOV5的话,可以参考本章节。只想跑通YOLOv5+deepsort的看官移步到下一章节。 1.1 yolov5下载 🐸yolov5源码在github下载地址上或者Gitee上面都有。需要注意的是由于yolov5的代码库作者一直在维护,所以下载的时候需…

【python】python开源代理ip池

一、前言 随着互联网的不断发展&#xff0c;越来越多的应用需要使用高匿代理IP才能访问目标网站&#xff0c;而代理IP作为一种能够隐藏本机真实IP地址的工具&#xff0c;在网络抓取、搜索引擎排名、广告投放、反爬虫等方面有着广泛的应用场景。但是&#xff0c;由于代理IP的稳…

open suse 15.5(任意版本) 使用阿里云的repo

一、shell suse 的包管理工具叫 zypper. zypper addrepo -f http://mirrors.aliyun.com/opensuse/distribution/leap/15.5/repo/oss/ openSUSE-15.5-Oss zypper addrepo -f http://mirrors.aliyun.com/opensuse/distribution/leap/15.5/repo/non-oss/ openSUSE-15.5-Non-Oss …

【Python】代理池针对ip拦截破解

代理池是一种常见的反反爬虫技术&#xff0c;通过维护一组可用的代理服务器&#xff0c;来在被反爬虫限制的情况下&#xff0c;实现数据的爬取。但是&#xff0c;代理池本身也面临着被目标网站针对ip进行拦截的风险。 本文将详细介绍代理池针对ip拦截破解的方法&#xff0c;包含…

psycopg2 使用ThreadedConnectionPool 工具封装

psycopg2 介绍 psycopg2库介绍: Psycopg2是一个用于Python编程语言的第三方库&#xff0c;用于访问PostgreSQL数据库系统。它提供了一组工具和方法&#xff0c;可以轻松地在Python程序中进行数据库操作&#xff0c;包括查询、插入、更新、删除等操作。 以下是Psycopg2库的一些…

【图像分类】基于LIME的CNN 图像分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Element Plus <el-table> 组件之展开行Table在项目中使用

目录 官方样式&#xff1a; 展开前&#xff1a; 展开&#xff1a; 原始代码&#xff1a; 代码详解&#xff1a; 项目使用场景&#xff1a; 完成效果&#xff1a; 具体实现范本&#xff1a; 1.调整数据结构 2. 修改标签和数据绑定 3. JavaScript 部分导入和创建对象 …

Spring事务和事务传播机制(2)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 在Spring框架中&#xff0c;事务管理是一种用于维护数据库操作的一致性和…

keepalived+lvs+nginx高并发集群

keepalivedlvsnginx高并发集群 简介&#xff1a; keepalivedlvsnginx高并发集群&#xff0c;是通过LVS将请求流量均匀分发给nginx集群&#xff0c;而当单机nginx出现状态异常或宕机时&#xff0c;keepalived会主动切换并将不健康nginx下线&#xff0c;维持集群稳定高可用 1.L…