剑指offer第五天

ops/2024/11/8 22:13:26/

1.包含min函数的栈

一个比较简单的模拟栈的操作

cpp">class Solution {
public:void push(int value) {st[op++] = value;}void pop() {if(op)op--;}int top() {return st[op-1];}int min() {int mi = 10001;for(int i = 0;i<op;++i)mi = std::min(mi,st[i]);return mi;}
private:int st[310]{};int op = 0;
};

2.栈的压入、弹出序列

思考一下这道题的做法,无非就是用栈来模拟一下这个过程,比较简单

  1. 借助一个辅助栈,来完成
    1. 按照pushV的顺序先插入到辅助栈中,和popV的元素去匹配
cpp">class Solution {
public:bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// write code herestack<int>st;int n = pushV.size(),idx = 0;for(int i = 0;i<n;++i){st.push(pushV[i]);if(st.top() == popV[idx]){while(!st.empty()&&st.top() == popV[idx]){st.pop(),idx++;}}}return st.empty();}
};

3.翻转单词序列

采用两步反转法,先把整体的字符串反转,再把每个单词反转

cpp">class Solution {void reverse(string& s, int l, int r){while (l < r){swap(s[l++], s[r--]);}}
public:string ReverseSentence(string str) {int n = str.size();//时间复杂度O(n),空间复杂度O(1)//两步反转法reverse(str, 0, n - 1);int l = 0, r = 0;while (l < n){while (l<n&&str[l] == ' ')l++;if (l >= n)break;r = l;while (r<n&&str[r] != ' ')r++;reverse(str, l, r - 1);l = r;}return str;}
};

4.滑动窗口的最大值

采用的是 set + 仿函数 的方式来解决这个问题,先把前size个数字加入到set中去,然后继续向后遍历,取出最大的,插入一个元素再删除一个元素

cpp">struct compare {bool operator()(const std::pair<int, int>& a,const std::pair<int, int>& b) const {if (a.first != b.first)return a.first > b.first;elsereturn a.second < b.second;}
};
class Solution {public:vector<int> maxInWindows(vector<int>& num, int size) {// write code hereset<pair<int, int>, compare>q; //从大到小进行排序vector<int> result;int n = num.size();if (size == 0 || size>n)return result;int i = 0;for (; i < size; ++i) {q.insert({num[i], i});}for (; i < n; ++i) {result.push_back(q.begin()->first);q.erase({num[i - size], i - size});q.insert({num[i], i});}result.push_back(q.begin()->first);return result;}
};

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

方法一:双指针

cpp">class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param numbers int整型vector * @return int整型*/int MoreThanHalfNum_Solution(vector<int>& numbers) {// write code heresort(numbers.begin(),numbers.end());int n = numbers.size();int half = n/2;//双指针int left = 0;while(left<n){int val = numbers[left];int right = left;while(right<n&&numbers[right]==val)right++;if(right-left>half)return val;left = right;}return -1;}
};

方法二:分析

cpp">class Solution {
public:int MoreThanHalfNum_Solution(vector<int>& numbers) {// write code heresort(numbers.begin(),numbers.end());return numbers[numbers.size()/2];}
};

6.旋转数组的最小数字

python">class Solution:def minNumberInRotateArray(self , nums: List[int]) -> int:# write code herereturn min(nums)

7.字符串的排列

cpp">class Solution {vector<string>result;int vis[15]{};string path;int n;void dfs(string&s,int u){if(u == n){result.push_back(path);return;}for(int i = 0;i<n;++i){if(i>0&&s[i]==s[i-1]&&!vis[i-1])continue;if(!vis[i]){vis[i] = true;path.push_back(s[i]);dfs(s,u+1);path.pop_back();vis[i] = false;}}}
public:vector<string> Permutation(string str) {// write code heren = str.size();sort(str.begin(),str.end());dfs(str,0);return result;}
};

8.数字序列的某一位的数字

python">def find_nth_digit(n):length = 1count = 9start = 1while n > length * count:n -= length * countlength += 1count *= 10start *= 10num = start + (n - 1) // lengthdigit_index = (n - 1) % lengthreturn int(str(num)[digit_index])
class Solution:def findNthDigit(self , n: int) -> int:# write code herereturn find_nth_digit(n)

http://www.ppmy.cn/ops/132046.html

相关文章

ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS

ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS 参考 Ubuntu 配置/etc/fstab参数实现开机自动挂载硬盘 https://blog.csdn.net/u010632165/article/details/89597522 blkid /dev/sda /dev/sda: UUID“91061d36-5043-4b9f-a616-ac934503962c” BLOCK_SIZE“4096”…

打印菱形(C语言)

程序&#xff1a; #include <stdio.h> int main() { int i,j; for(i1;i<5;i){ for(j0;j<6-i;j){ printf(" ");} for(j0;j<i*2-1;j){ printf("*");} printf("\n");} …

DBA之路,始于足下

DBA之路&#xff0c;始于足下 与DBA的缘分工作一年的体会未来的规划 与DBA的缘分 我以前从来没有想过会成为一名DBA。从进入研究生开始&#xff0c;我就已经给自己规划好了找工作的学习路线-Java开发工程师。我从算法、项目、八股、面试等各个方面展开准备&#xff0c;所有的面…

nVisual 2D/3D切换

1.创建3D场景节点&#xff0c;复制id&#xff0c;例如24000000115685 2.找到需要跳转到此3D场景的2D场景节点&#xff0c;复制id&#xff0c;例如24000000087275 3.数据库执行搜索命令 SELECT * from nodes where id 24000000087275 4.查看搜索结果的 background 如果节点…

Android的Handler

1. Handler是用于线程间通信&#xff0c;本质上是&#xff1a; Handler调用发送方法&#xff0c;向与Looper绑定的消息队列写入消息&#xff0c;然后Looper.loop()会循环的从消息队列里拿出消息。并调用dispatchMessage处理消息。而需要此消息的线程会实现回调的handleMessage…

蓝桥杯介绍

蓝桥杯是全国性的IT类学科竞赛,全称为蓝桥杯全国软件和信息技术专业人才大赛。 一、竞赛特点 涵盖多个领域 蓝桥杯竞赛涵盖了多个领域,包括软件开发、电子设计、嵌入式设计等。不同领域的竞赛内容和要求各不相同,但都注重考查学生的实践能力和创新能力。例如,软件开发类竞…

Android 解决MTK相机前摄镜像问题

很莫名其妙的&#xff0c;前摄默认镜像&#xff0c;原来是为了前摄拍字体正确显示&#xff0c;比如自拍&#xff0c;前摄拍摄的人像虽左右镜像了&#xff0c;但如果后面有字牌显示&#xff0c;字体会显示正常而不是翻转。但现在需求是满足普遍的前摄原生代码不带镜像修改&#…

对称二叉树(力扣101)

题目如下: 思路 对于这道题, 我会采用递归的解法. 看着对称的二叉树, 写下判断对称的条件, 再进入递归即可. 值得注意的是, 代码中会有两个函数, 第一个是isSymmetric,第二个是judge. 因为这里会考虑到一种特殊情况, 那就是 二叉树的根结点(最上面的那个),它会单独用…