ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 1573

2021-01-08 09:35:40  阅读:253  来源: 互联网

标签:一堆 int 个数 long 之间 1573 10101 leetcode


简介

我们自己观察题目发现了什么这是一道数学题,哈哈哈。
个人的思路是分成两类去判断,
第一种:
全是0
使用

\[ (n-1) * (n - 2) / 2 \]

第二种:
有1
然后观察10101
发现10101
其中0的个数两个之间
1个和1个

\[ (前一堆1和中间一堆1之间的0的个数+1) * (后一堆1和中间一堆1之间的0的个数+1) = 结果 \]

Tips

注意防止溢出

AC code

class Solution1573 {
public:
    int numWays(string s) {
        // step 1. count the number of the 1
        long int numberOne = 0;
        for(long int i=0; i<s.length(); i++){
            if(s[i] == '1'){
                numberOne++;
            }
        }
        // step 2. check the numberOne can be subdivided 3?
        if(numberOne % 3 != 0){
            return 0;
        }
        if(numberOne == 0){
            double n = s.length() - 1;
            return (long int)((n / 2) * (n-1))  % (1000000000 + 7)  ;
        }
        long int onePiece = numberOne / 3;
        // step 3. get the numberZero between first piece and third piece
        long int numberZero1 = 0; long int numberZero2 = 0;
        long int index = 0;
        long int status = -1;
        for(long int i=0; i<s.length(); i++){
            if(index == onePiece){
                status = 0;
            }
            if(status == -1){
                if(s[i] == '1'){
                    index++;
                }
            }
            if(status == 0){
                if(s[i] == '1'){
                    status = 1;
                    break;
                }else if(s[i] == '0'){
                    numberZero1++;
                }
            }
        }
        string tmp;
        tmp.resize(s.length());
        long int j=0;
        for(long int i=s.length() -1; i>=0; i--,j++){
            tmp[j] = s[i]; 
        }
        index = 0;
        status = -1;
        for(long int i=0; i<tmp.length(); i++){
            if(index == onePiece){
                status = 0;
            }
            if(status == -1){
                if(tmp[i] == '1'){
                    index++;
                }
            }
            if(status == 0){
                if(tmp[i] == '1'){
                    status = 1;
                    break;
                }else if(tmp[i] == '0'){
                    numberZero2++;
                }
            }
        }
        // step 4. get the number
        return ((numberZero1+1) % (1000000000 + 7) * (numberZero2+1) % (1000000000 + 7))% (1000000000 + 7); 
    }
    long long factorial(long long n){
        long long num = 1;
        for(long long i=1; i <= n; i++){
            num = num * i % (1000000000 + 7);
        }
        return num;
    }
};

link

https://github.com/lishaohsuai/leetCode

标签:一堆,int,个数,long,之间,1573,10101,leetcode
来源: https://www.cnblogs.com/eat-too-much/p/14249891.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有