栈相关
1.栈的压入、弹出序列
先将元素压入栈内,如果栈顶和输出的序列相等,那么就pop栈顶,否则就继续压入元素。
算法流程:
- 初始化: 辅助栈 stack,弹出序列的索引 i;
- 遍历压栈序列: 各元素记为 num ,元素 num入栈;
- 循环出栈:若 stack 的栈顶元素 == 弹出序列元素 popped[i],则执行出栈与 i++;
- 返回值: 若 stack 为空,则此弹出序列合法。
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size() != popV.size())return false;
if(pushV.size()<1)return true;
stack<int> p;
int j=0;
for(int i=0; i<pushV.size(); i++){
p.push(pushV[i]);
//栈顶元素等于输出序列
while(!p.empty() && p.top()==popV[j]){
p.pop();
j++;
}
}
//若合法,则辅助栈应该为空
return p.empty();
}
};
查找
2.从 1 到 n 整数中 1 出现的次数
遍历1~n,求每一位,若为1则++。
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int con=0;
for(int i=n ; i>0; i--){
for(int j=i;j>0;j/=10){
if(j%10==1)con++;
}
}
return con;
}
};
字符串
3.替换空格
牛客的点在开辟空间,但是LeetCode上利用C++特性可以很好的实现:
class Solution {
public:
string replaceSpace(string s) { //字符数组
string array; //存储结果
for(auto &c : s){ //遍历原字符串
if(c == ' '){
array+="%20"
}
else{
array+=c;
}
}
return array;
}
};
牛客的点在于在原数组更改:由于函数返回为void,说明此题不能另外开辟数组,需要in-place操作。我们知道字符串的遍历无非是从左到右和从右到左两种。
1)如果从左到右,会发现如果遇到空格,会将原来的字符覆盖。于是,此方法不行。
2)那么就考虑从右向左,遇到空格,就填充“20%“,否则将原字符移动应该呆的位置。
class Solution {
public:
void replaceSpace(char *str,int length) {
if(str==nullptr || length<=0)return;
int l=0;
for(int i=0;i<length;i++){
if(str[i]==' ')l++;
}
if(l==0)return;
int newlength =length+2*l;
for(int i=length; i>=0; --i){
if(str[i]==' '){
str[newlength--]='0';
str[newlength--]='2';
str[newlength--]='%';
}
else
str[newlength--]=str[i];
}
}
};
4.第一个只出现一次的字符
hash:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
unordered_map<char, int> p;
for(auto c:str){
p[c]++;
}
for(int i=0;i<str.length();i++){
if(p[str[i]]==1)return i;
}
return -1;
}
};
5.左旋转字符串
str.substr截取字符串,用+拼接:
class Solution {
public:
string LeftRotateString(string str, int n) {
if(n==0 || str.size()==1 || n>str.size() )return str;
return str.substr(n,str.size()-n)+str.substr(0,n);
}
};