菜鸡挑战五天刷完剑指offer day3-2

本文解析了剑指Offer中的经典题目,包括栈的压入弹出序列验证、1到n整数中1的出现次数、字符串处理如替换空格、寻找第一个唯一字符及左旋转字符串等。通过代码示例,深入探讨了算法设计与实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈相关

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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值