表示数字

描述

将一个字符中所有的整数前后加上符号“*”,其他字符保持不变。连续的数字视为一个整数。
注意:本题有多组样例输入。
输入描述:
输入一个字符串
输出描述:
字符中所有出现的数字前后加上符号“*”,其他字符保持不变

方法一

思路分析

本题我的第一个想法是,首先设置判断数组判断每一位上面的字符是否为数字,如果是数字则记录为1,之后遍历字符串数组,如果是数字 首先输出*,输出连续的数字,最后输出*,不过代码没有通过

核心代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string temp;
    while(cin>>temp)
    {
        //cout<<temp<<endl;
        int n=temp.length();
        //cout<<n<<endl;
        vector<int>dp(n,0);
        for(int i=0;i<n;i++)
        {
            if(isdigit(temp[i]))//判断是否为数字 1表示为数字
            {
                if(i==0) dp[i]=1;
                else dp[i]=dp[i-1]+1;
            }
        }
//         for(int i=0;i<n;i++)
//             cout<<dp[i];
//         cout<<endl;
        string new_temp;
        int i=0;
        for(;i<n;)
        {
            if(dp[i]==0)//不是数字直接输出
            {
                cout<<temp[i];
                i++;
            }
            if(dp[i]==1)//如果是数字 首先输出*
            {
                int k=i;
                int count=1;
                cout<<"*";
                while(dp[i+1]!=0&&i<n)//输出连续的数字
                {
                    i++;
                }
                int j=i;
                
                cout<<temp.substr(k,j-k);
                cout<<"*";
                i=j;
            }      
        }
     //cout<<temp<<endl;
    }
    return 0;
}

复杂度分析

  • 时间复杂度:时间复杂度为$O(n)$
  • 空间复杂度:定义了一个数组判断是否为数字,空间复杂度为$O(1)$


方法二

思路分析

方法一种其实本不必设置一个数组存储判断结果,因此方法二直接判断,暴力解法

图解

字符串 Jkdi234klo
输出 J

k
d
i
遇到数字先输出* *

234
遇到的不是数字,输出*
*

k
l
o


核心代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string temp;
    while(cin>>temp)
    {
        int n=temp.length();
        for(int i=0;i<n;)//单个字符判断
        {
            if(isdigit(temp[i]))//数字判断
            {
                cout<<"*";
                while(isdigit(temp[i]))//找到数字子串并输出
                {
                   cout<<temp[i];
                    i++;
                }
                cout<<"*";//数字子串最后的位置输出*
            }
            else
            {
                cout<<temp[i];
                i++;
            }
        }
        cout<<endl;
        
    }
}

复杂度分析

  • 时间复杂度:时间复杂度为$O(n)$
  • 空间复杂度:空间复杂度为$O(1)$

方法三

思路分析

不调用判断数字的函数

核心代码

#include<stdio.h>
#include<string.h>
int main()
    {
    int i,len;
    char str[1000];
    while(scanf("%s",str)!=EOF)
        {
        len=strlen(str);
        for(i=0;i<len;)
            if(str[i]>='0'&&str[i]<='9')
            {
            printf("*");
            while(str[i]>='0'&&str[i]<='9')
                {
                printf("%c",str[i]);
                i++;
            }
            printf("*");
        }
        else 
        {
            printf("%c",str[i]);
            i++;
        }
    printf("\n");
    }
    return 0;
}

复杂度分析

  • 时间复杂度:时间复杂度为$O(n)$
  • 空间复杂度:空间复杂度为$O(1)$