剑指Offer_编程题(把字符串转换成整数 / 数组中重复的数字 / 构建乘积数组 / 正则表达式匹配 )

剑指Offer_编程题

49、把字符串转换成整数

时间限制:1秒 空间限制:32768K 热度指数:223789

本题知识点: 字符串 进制转化

题目描述:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。

输入描述:输入一个字符串,包括数字字母符号,可以为空

输出描述:如果是合法的数值表达则返回该数字,否则返回0

思路:整数,好判断,只要处理第一位之后,只要判断后面是不是数字。

class Solution {
public:
    int StrToInt(string str) {
        if(str=="0"||str=="") return 0;
        int flag=0,len=str.size();//合法
        int fu=0,cnt=0;
        long long val=0;
        if(str[cnt]=='-') fu=1,cnt++;
        else if(str[cnt]=='+') fu=2,cnt++;
        while(cnt='0'){
                val=val*10+str[cnt]-'0';
            }
            else{
                flag=1;
                break;
            }
            cnt++;
        }
        if(flag) return 0;
        else{
            if(fu==1) val=-val;
            return val;
        }
    }
};

50、数组中重复的数字

时间限制:1秒 空间限制:32768K 热度指数:284260

本题知识点: 数组

题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

思路:开一个200的数组(ASCII数目是128),遍历一遍记数,在遍历一遍判断

class Solution {
public:
    // Parameters:
    //        numbers:     an array of integers
    //        length:      the length of array numbers
    //        duplication: (Output) the duplicated number in the array number
    // Return value:       true if the input is valid, and there are some duplications in the array number
    //                     otherwise false
    bool duplicate(int numbers[], int length, int* duplication) {
        int cnt[200];
        memset(cnt,0,sizeof(cnt));
        bool flag=false;
        for(int i=0;i1){
                *duplication=numbers[i];
                flag=true;
                break;
            }
        }
        return flag;
    }
};

51、构建乘积数组

时间限制:1秒 空间限制:32768K 热度指数:139906

本题知识点: 数组

题目描述:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

思路:分上三角和下三角处理

class Solution {
public:
    vector multiply(const vector& A) {
        int len=A.size();
        vector B(len);
        B[0]=1;
        for(int i=1;i=0;i--){
            temp*=A[i+1];
            B[i]*=temp;
        }
        return B;
    }
};

 

52、正则表达式匹配

时间限制:1秒 空间限制:32768K 热度指数:224879

本题知识点: 字符串

题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

思路:讲道理这道题一开始没读懂这个描述,原来是#前面的那个字符可以出现0-n次,所以aaa与ab*ac*a匹配,其中b,c出现0次。对于aaa与aa.a不匹配,因为aa.a的数目多了。匹配是指完全匹配两个字符可以一模一样。还有char* 不好处理和截取,转换成string处理,后面有的字符串题也是这么干的。递归开始找。需要分情况的是1.后面没有#,直接匹配 2.后面是# 可以省略也可以多次。

class Solution {
public:
    bool mymatch(string str,string pattern){
        int lens=str.size();
        int lenp=pattern.size();
        if(lens==0&&lenp==0) return true;
        if(lenp==0&&lens!=0) return false;
        if(pattern[0]=='*') return false;
        if(lenp>1&&pattern[1]=='*'){//*前面一位可以出现0,1,2
            if(lens>0&&(str[0]==pattern[0]||pattern[0]=='.'))
                return mymatch(str.substr(1),pattern)||mymatch(str,pattern.substr(2));
            else
                return mymatch(str,pattern.substr(2));
        }
        else if(lens>0&&(str[0]==pattern[0]||pattern[0]=='.')){
            return mymatch(str.substr(1),pattern.substr(1));//向下匹配 
        }
        else return false;
    }
    bool match(char* str, char* pattern)
    {//实话讲一直没读懂题意。。。
        string s="";
        string p="";
        int lens=strlen(str);
        int lenp=strlen(pattern);
        for(int i=0;i

 

你可能感兴趣的:(剑指offer_编程题)