配套力扣剑指offer剑指 Offer。
刷题顺序同上。同时结合书上内容。
1. 剑指 Offer 09. 用两个栈实现队列
最大的问题之读不懂题。
以为输入输出要自己写,忘记这是核心代码模式,然后在那边写main
,emm。
class CQueue {
public:
stack<int> s1;
stack<int> s2;
CQueue() {
//s1=new stack<>();
//s2=new stack<>();
}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
if(s1.empty()) return -1;
else
{
int tmp;
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
tmp=s2.top();
s2.pop();
while(!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
return tmp;
}
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
#if 0
int main()
{
string in[10000];//输入字符串数组
int i=0;
while(cin>>in[i++]) {}//最后第i位为空
int size=i;//输入字符串个数
int innum[10000];//输入参数
i=0;
while(cin>>innum[i++]) {}
string out[10000];//输出结果
i=0;
if(in[0]=="CQueue")
{
CQueue * obj = new CQueue();
out[i++]="null";
}
for(int j=1;j<size;j++)//循环判断指令
{
if(in[j]=="appendTail")
{
obj->appendTail(innum[j]);
out[i++]="null";
}
if(in[j]=="deleteHead")
{
out[i++]=obj->deleteHead();
}
}
cout << "[";
for(int k=0;k<size;k++)
{
cout << out[k];
if(k<size-1) cout << ",";
else cout << "]";
}
delete CQueue;
}
#endif
2. 剑指 Offer 30. 包含min函数的栈
第1版,沿用2个栈,一般可用,太多超时。
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s1;
stack<int> s2;//暴力思路,参照题9,输入到另一个栈检测,然后再返回去
int tmp;//保存最小值,先初始化为最大值
MinStack() {}
void push(int x) {
s1.push(x);
}
void pop() {
if(s1.empty()) return;
s1.pop();
}
int top() {
return s1.top();
}
int min() {
tmp=INT_MAX;//保存最小值,先初始化为最大值
while(!s1.empty())
{
tmp=s1.top()<tmp?s1.top():tmp;
s2.push(s1.top());
s1.pop();
}
while(!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
return tmp;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->min();
*/
就用vector
实现栈功能,不会超时。
class MinStack {
public:
/** initialize your data structure here. */
vector<int> s1;//改进一下,用vector
int tmp;//保存最小值,先初始化为最大值
MinStack() {}
void push(int x) {
s1.push_back(x);
}
void pop() {
if(s1.empty()) return;
s1.pop_back();
}
int top() {
return s1[s1.size()-1];
}
int min() {
tmp=INT_MAX;//保存最小值,先初始化为最大值
for(int i=0;i<s1.size();i++)
{
tmp=s1[i]<tmp?s1[i]:tmp;
}
return tmp;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->min();
*/
3. 剑指 Offer 06. 从尾到头打印链表
第一次考虑问题大概率会有疏漏,慢慢调整就好。
这里的注意点:
1)类成员函数的输入为指针,所以调用结构体的成员要用->
2)指针可能为空
3)用指针下一位指针是否为空作为判定条件,要记得加上最后一个元素
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> res;//输出结果
vector<int> reversePrint(ListNode* head) {
if(head==nullptr) return res;
while(head->next!=nullptr)
{
res.push_back(head->val);
head=head->next;
}
res.push_back(head->val);//把最后一个元素保存上
reverse(res.begin(),res.end());
return res;
}
};