leetcode 题解代码整理 6-10题

ZigZag Conversion


The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R
And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR". 

题意:按之字形给如图的字符串,和行数N,求横向输出每排字符串的结果
思路:对于每个位置的字符可用公式求出在原字符串中的位置,逐位输出即可,注意(“A”,2)这种数据和空串

class Solution
{
public:
    string convert(string s, int numRows)
    {
        int len=s.length();
        string ans;

        if (numRows>len) numRows=len;
        if (numRows<=1 )
            return s;

        ans="";

        int k=0;
        int key=2*(numRows-1);
        for (int i=0;i<len;i+=key)
            ans+=s[i];

        int temp=key;
        for (int j=1;j<numRows-1;j++)
        {
            temp-=2;
            for (int i=j;i<len;i+=key)
            {
                ans+=s[i];
                if (i+temp<len)
                    ans+=s[i+temp];
            }
        }

        for (int i=numRows-1;i<len;i+=key)
            ans+=s[i];

      
        return ans;


    }
};


Reverse Integer

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

int型数字反转输出,注意处理翻转后越界的情况
class Solution
{
public:
    int reverse(int x)
    {
        if (overflow(x)==true)
            return 0;
        int ret=0;
        while (x!=0)
        {
            ret=ret*10+x%10;
            x/=10;
        }
        return ret;
    }

private:
    bool overflow(int x)
    {
        if (x/1000000000==0)
            return false;
        else
        if (x == INT_MIN)
            return true;

        x=abs(x);
        for (int cmp=463847412;cmp!=0;cmp/=10,x/=10)
            if (x%10>cmp%10)
                return true;
            else
            if (x%10<cmp%10)
                return false;
        return false;
    }
};


String to Integer (atoi)

 

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

模拟atoi函数,注意读入前导空串和非法字符以及超界情况
class Solution
{
public:
    int myAtoi(string str)
    {
        int len,i,flag,j;
        long long temp;
        len=str.length();
        if (len==0)
            return 0;
        
        i=0;
        while (str[i]==' ' )
            i++;
            
        flag=1;
        if (str[i]=='+')
            i++;
        else 
        if (str[i]=='-')
        {
            i++;
            flag=-1;
        }
        
        temp=0;
        for (j=i;j<len;j++)
        {
            if (str[j]<'0' || str[j]>'9') break;
            temp=temp*10+str[j]-'0';
            
            if (temp>INT_MAX)
            {
                if (flag==1) return INT_MAX;
                else return INT_MIN;
            }
        }
        temp*=flag;
        return (int)temp;
        
        
    }
};

Palindrome Number
Determine whether an integer is a palindrome. Do this without extra space.
判断数字是否为回文串
class Solution {
public:
    bool isPalindrome(int x) 
    {
        int n=0;
        int num[20];
        if (x<0) return false;
        while (x!=0)
        {
            num[n++]=x%10;
            x/=10;
        }
        n--;
        int i=0;
        while (i<n)
            if (num[i++]!=num[n--]) return false;
        return true;   
    }
};

Regular Expression Matching

Implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

正则表达式的匹配,只需要考虑“.'和”*“即可
递归求解
class Solution 
{
public:
    bool isMatch(string s, string p) 
    {
        if (p.size()==0)
        {
            if (s.size()==0) return true;
            else return false;
        }
        
        if (p[1]!='*')
        {
            if (p[0]==s[0] || (p[0]=='.' && s.size()!=0))
                return isMatch(s.substr(1),p.substr(1));
            else 
                return false;
        }
        else 
        {
            int a=0;
            while (p[0]==s[a] || (p[0]=='.' && s.size()!=0))
            {
                if (isMatch(s.substr(a),p.substr(2)))
                    return true;
                a++;
             //   if (a==s.size()) break;
            }
                    
            return false;
        }
        
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值