剑指office--字符串

PS:以下代码均为C++代码实现

1.替换空格力扣

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."

限制:

0 <= s 的长度 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof

该题方法很多,在此不一一列举,只简单介绍两种方法

1.新建一个变量,将原数据拷贝进去

class Solution {
public:
    string replaceSpace(string s)
    {
        //创建一个的string类型的变量
        string str;
        for (int i = 0; i < s.size(); i++)
        {
            //如果不等于空格,就把原字符串加到str中,
            if (s[i] != ' ')
                str += s[i];
            //如果等于空格,就加在str中加入“%20”
            else
            {
                str += "%20";
            }

        }
        //返回str
        return str;
    }
};

2.在原来的数据中做修改

class Solution {
public:
    string replaceSpace(string s) 
    {
        //先插入%20
        for(int i=0;i<s.size();i++)
        {
            if(s[i]==' ')
            {
                s.insert(i,"%20");
                i+=3;
            }
        }
        //删除空格
        for(int i=0;i<s.size();i++)
        {
            if(s[i]==' ')
            {
                s.erase(i,1);
            }
        }
        return s;
    }
};

2.左旋转字符串 力扣

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:

输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例 2:

输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

限制:

    1 <= k < s.length <= 10000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof

这道题方法也很多,这里简单介绍一种最简单的

class Solution 
{
public:
    string reverseLeftWords(string s, int n) 
    {
        //新建一个变量,初始化为需要反转的后半部分
        string s1=s.substr(n,s.size()-1);
        //再建一个变量,初始化为需要反转的前部分
        string s2=s.substr(0,n);
        //两部分相加,处理完成
        return s1+s2;
    }
};

3.表示数值的字符串 力扣

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

    若干空格
    一个 小数 或者 整数
    (可选)一个 'e' 或 'E' ,后面跟着一个 整数
    若干空格

小数(按顺序)可以分成以下几个部分:

    (可选)一个符号字符('+' 或 '-')
    下述格式之一:
        至少一位数字,后面跟着一个点 '.'
        至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
        一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

    (可选)一个符号字符('+' 或 '-')
    至少一位数字

部分数值列举如下:

    ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

    ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

示例 1:

输入:s = "0"
输出:true

示例 2:

输入:s = "e"
输出:false

示例 3:

输入:s = "."
输出:false

示例 4:

输入:s = "    .1  "
输出:true

提示:

    1 <= s.length <= 20
    s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof

这道题目可以暴力求解,也可使用算法求解

我用第二种方法解决,这道题也有不同的算法可以解决,有需要的可自主研究

class Solution {
public:
    bool isNumber(string s) 
    {
        int i=0;
        //先去除头部空格,中间地方出现空格均为非法,return false
        while(i<s.size()&&s[i]==' ')
        {
            i++;
        }
        //将去除空格的字符串重新赋值给原字符串
        s=s.substr(i);
        //去除尾部空格
        while (s.back() == ' ')
        {
            s.pop_back();
        }
        //将所用到的全部初始化为假
        bool number=false;
        bool dotber=false;
        bool eber=false;
        for(i=0;i<s.size();i++)
        {
            //如果为数字,则为真
            if(isdigit(s[i]))
            {
                number=true;
            }
            //如果出现小数点,并且没有"E"或"e",且只有一个小数点,则为真
            else if(s[i]=='.'&&
                    !dotber&&
                    !eber)
            {
                dotber=true;
            }
            //判断是否有"E"出现,只有一个"E",且没有小数点,且数字为真,则为真,
            else if((s[i]=='e'||s[i]=='E')&&
                    !eber&&
                    number)
                    {
                        //将数字改为假,因为"E"之后只能为数字,否则为假
                        number=false;
                        eber=true;
                    }
            //判断"+","-"号问题
            else if((s[i]=='+'||s[i]=='-')&&
                    (i==0||s[i-1]=='e'||s[i-1]=='E'))
            {
                number=false;
            }
            //其他情况为假
            else 
            {
                return false;
            }
        }
        return number;
    }
};

4.把字符串变为整数

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
     因此返回 INT_MIN (−231) 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof

这道题也有不同的方法实现,但具体的算法大同小异

class Solution {
public:
    int strToInt(string str) 
    {
        long long result = 0;//使用长整型,防止溢出
        int i = 0;
        while (str[i] == ' ')//去除空格
        {
            i++;
            if (i == str.size())//如果全部为空格,则结果为0
                return result;
        }
        //判断字符是否非法
        if (('0' <= str[i] && str[i] <= '9') || 
            str[i] == '-' || str[i] == '+')
        {
            //判断是否为"+","-"号问题
            bool temp = 1;
            if (str[i] == '-')
            {
                temp = 0;
                i++;
            }
            else if (str[i] == '+')
            {
                i++;
            }
            //去除字母,保留前n个数字
            while ('0' <= str[i] && str[i] <= '9' && i < str.size())
            {
                int x = str[i] - '0';
                result = result * 10 + x;

                if (result >= (pow(2, 31)))
                {
                    if (temp == 0)
                        result = 0 - result;
                    if (result <= (0 - pow(2, 31)))//如果大于最大值,则返回整形最大值
                        return INT_MIN;
                    return INT_MAX;
                }
                i++;
            }
            //判断是否为负数
            if (temp == 0)
                result = 0 - result;
            return result;
        }
        else
        {
            return result;
        }
    }
};

PS:剑指offic第一部分

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

函数指针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值