LeetCode 2015.8.8-2015.8.14 240,222,3,54,61,242,179,43,227

LeetCode 2015.8.8-2015.8.14 240,222,3,54,61,242,179,43,227

240 Search a 2D Matrix II 2015.8.8
class Solution {
public:
    bool searchMatrix(vector< vector<int> >& matrix, int target) {
        if (matrix.size()==0) return false;
        int i,j,rows=matrix.size(),cols=matrix[0].size();
        i = 0;
        j = cols -1;
        while (i<rows && j>=0)
        {
            if (matrix[i][j]==target) return true;
            else if (matrix[i][j]>target) j--;
            else i++;
        }
        return false;
    }
};

222 Count Complete Tree Nodes 2015.8.8
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root==NULL) return 0;
        int l=getLeftCount(root)+1,r=getRightCount(root)+1;
        if (l==r) return (2<<(l-1))-1;
        else
            return countNodes(root->left)+countNodes(root->right)+1;
    }
    int getLeftCount(TreeNode* root)
    {
        int cnt = 0;
        while (root->left!=NULL)
        {
            cnt++;
            root=root->left;
        }
        return cnt;
    }
    int getRightCount(TreeNode* root)
    {
        int cnt = 0;
        while (root->right!=NULL)
        {
            cnt++;
            root=root->right;
        }
        return cnt;
    }
};

3 Longest Substring Without Repeating Characters 2015.8.8
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int ans = -1;
        int n=s.size();
        if (n==0) return 0;
        int i=0,j=-1;
        int ch[300]={0};
        while (j+1<n)
        {
            j++;
            while (ch[s[j]]==1)
            {
                ch[s[i]]=0;
                i++;
            }
            ch[s[j]]=1;
            if (j-i+1>ans) ans=j-i+1;
        }
        return ans;
    }
};

54 Spiral Matrix 2015.8.10
class Solution {
public:
    vector<int> spiralOrder(vector< vector<int> >& matrix) {
        int m = matrix.size();
        vector<int> ans;
        if (m==0) return ans;
        int n = matrix[0].size(),dir=4;
        int total = m*n;
        bool flag[m+5][n+5];
        int dx[4]={0,1,0,-1};
        int dy[4]={1,0,-1,0};
        m++;n++;
        for(int i=0;i<=m;i++)
            for(int j=0;j<=n;j++)
                flag[i][j]=true;
        for(int j=0;j<=n;j++)
        {
            flag[0][j]=false;
            flag[m][j]=false;
        }
        for(int i=0;i<=m;i++)
        {
            flag[i][0]=false;
            flag[i][n]=false;
        }
        int x = 1, y = 0;
        while (ans.size()!=total)
        {
            for(int i=0;i<dir;i++)
            {
                while (flag[x+dx[i]][y+dy[i]])
                {
                    x=x+dx[i];
                    y=y+dy[i];
                    flag[x][y]=false;
                    ans.push_back(matrix[x-1][y-1]);
                }
            }
        }
        return ans;
    }
};

61 Rotate List 2015.8.11
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if (head==NULL || k==0) return head;
        ListNode* h=new ListNode(0);
        h->next=head;
        ListNode* p=h;
        int n=0;
        while (p->next!=NULL)
        {
            n++;
            p=p->next;
        }
        k=k%n;
        if (k==0) return head;
        int m=n-k;
        p=h;
        for(int i=1;i<=m;i++)
            p=p->next;
        ListNode* f=p->next;
        p->next=NULL;
        p=f;
        for(int i=1;i<k;i++)
            p=p->next;
        p->next=head;
        return f;
    }
};

242 Valid Anagram Easy 2015.8.11
class Solution {
public:
    bool isAnagram(string s, string t) {
        char ch[300]={0};
        int lens=s.size(),lent=t.size();
        for(int i=0;i<lens;i++)
            ch[s[i]]++;
        for(int i=0;i<lent;i++)
            ch[t[i]]--;
        for(int i='a';i<='z';i++)
            if (ch[i]!=0) return false;
        return true;
    }
};

179 Largest Number 2015.8.13
class Solution {
public:
    string largestNumber(vector<int>& nums) {
        int len = nums.size();

        vector<string> strs;
        // Change to string
        for(int i=0;i<len;i++)
        {
            char buff[20];
            sprintf(buff,"%d",nums[i]);
            strs.push_back(buff);
        }

        sort(strs.begin(),strs.end(),cmp);

        string ret;
        for(int i=0;i<len;i++)
            ret+= strs[i];
        if(ret=="" || ret[0]=='0') ret="0";

        return ret;
    }

    static bool cmp(string a,string b)
    {
        return a+b>b+a;
    }
};

43 Multiply Strings 2015.8.13
class Solution {
public:
    string multiply(string num1, string num2) {
        int len1=num1.size(),len2=num2.size();
        if (len1==1 && num1[0]=='0') return "0";
        if (len2==1 && num2[0]=='0') return "0";
        int a[len1],b[len2];
        vector<int> ans;
        ans.resize(len1+len2);
        len1--;len2--;
        for(int i=0;i<=len1;i++)
            a[i]=num1[len1-i]-'0';
        for(int i=0;i<=len2;i++)
            b[i]=num2[len2-i]-'0';
        for(int i=0;i<=len1;i++)
            for(int j=0;j<=len2;j++)
                ans[i+j]+=a[i]*b[j];
        int len = len1+len2;
        for(int i=0;i<=len;i++)
        {
            ans[i+1]+= ans[i]/10;
            ans[i]%= 10;
        }
        len++;
        while (ans[len]>10)
        {
            ans.push_back(ans[len]/10);
            ans[len]%=10;
            len++;
        }
        while (ans[len]==0)
        {
                len--;
                ans.pop_back();
        }
        string s;
        for(int i=len;i>=0;i--)
            s.push_back(ans[i]+'0');
        return s;
    }
};

227 Basic Calculator II 2015.8.14
1. 自己的,速度非常慢,被我人为搞复杂了。
class Solution {
public:
    int calculate(string s) {
        vector<int> op;
        vector<int> num;
        stack<int> sop;
        stack<int> snum;
        int flag[5]={0,0,0,1,1};
        int k=0, ch[300]={0} , len = s.size();
        ch['+']=1;ch['-']=2;
        ch['*']=3;ch['/']=4;
        for(int i=0;i<len;i++)
        {
            if (s[i]==' ') continue;
            if (s[i]>='0' && s[i]<='9')
            {
                k = s[i]-'0' + k*10;
            }
            else
            {
                num.push_back(k);
                k=0;
                op.push_back(ch[s[i]]);
            }
        }
        num.push_back(k);
        snum.push(num[0]);
        int k1,k2,ans;
        for(int i=0;i<op.size();i++)
        {
            if (sop.empty())
            {
                snum.push(num[i+1]);
                sop.push(op[i]);
            }
            else
            {
                if (flag[op[i]] <= flag[sop.top()])
                {
                    k1 = snum.top();snum.pop();
                    k2 = snum.top();snum.pop();
                    ans = cal(k2,k1,sop.top());
                    sop.pop();
                    snum.push(ans);
                    sop.push(op[i]);
                    snum.push(num[i+1]);
                    cout<<ans<<endl;
                }
                else
                {
                    ans =cal(snum.top(),num[i+1],op[i]);
                    snum.pop();snum.push(ans);
                    cout<<ans<<endl;
                }
            }
        }
        while (!sop.empty())
        {
            k1 = snum.top();snum.pop();
            k2 = snum.top();snum.pop();
            ans = cal(k2,k1,sop.top());
            sop.pop();
            snum.push(ans);
        }
        return snum.top();
    }
    int cal(int k1,int k2,int op)
    {
        switch (op)
        {
            case 1: return k1+k2;break;
            case 2: return k1-k2;break;
            case 3: return k1*k2;break;
            case 4: return round(k1/k2);break;
        }
    }
};

2. 网上搜的
class Solution {
public:
    int calculate(string s) {
        istringstream in(s+"+");
        long long total = 0, term, sign =1,n;
        in>>term;
        char op;
        while (in >> op)
        {
            if (op=='+' || op=='-')
            {
                total +=sign * term;
                sign = 44-op;
                in>>term;
            }
            else
            {
                in >> n;
                if (op=='*')
                    term *=n;
                else term /=n;
            }
        }
        return total;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值