阿里面试题

来源:互联网 发布:手机防辐射软件 编辑:程序博客网 时间:2024/06/07 05:09

题意:
给定一串数字
判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字之和均相同(该3个元素不纳入计算)
要求时间复杂度和空间复杂度均不能超过O(n)
考虑到时间复杂度,下面给我我的方法。

void main(){    char ch[] = "12345678112345678112345678112345678";    int len = strlen(ch);    int sum = 0,partOfSum=0;    for (int i = 0; i < len; i++)    {        sum = sum + (char)ch[i] -0x30;    }    int flag[3] = {0,0,0};    for (int i = 0; i < len; i++)    {        if (flag[0] == 0)        {               if ((partOfSum * 4+ (ch[i]-0x30)*3) == sum)            {                flag[0] = 1;                partOfSum = 0;                continue;            }            partOfSum = partOfSum + (char)ch[i] - 0x30;        }        if (flag[0] == 1&& flag[1] ==0)        {            if ((partOfSum * 4 + (ch[i] - 0x30) * 3) == sum)            {                flag[1] = 1;                partOfSum = 0;                continue;            }            partOfSum = partOfSum + (char)ch[i] - 0x30;        }        if (flag[1] == 1 && flag[2] == 0)        {                   if ((partOfSum * 4 + (ch[i] - 0x30) * 3) == sum)            {                flag[2] = 1;                partOfSum = 0;                continue;            }            partOfSum = partOfSum + (char)ch[i] - 0x30;        }    }    if(flag[2] ==1)        printf("we can divide the string");}

下面给出csdn一个其他博主的方法:
思路:
奇妙的利用了单调性,枚举第一段的和, 第一段的和确定了,那么接下来的2,3,4段的和就都确定了,什么单调性呢? 就是i右移,j,k都要右移。这就是单调性了,第一段变大,那么234段都要变大,所以i,j,k,都只会往右移,如果有正有负就没有单调性了。。。
代码:

#define first sum[i-1]#define second sum[j-1] -sum[i]#define third sum[k -1] -sum[j]#define four sum[n-1] -sum[k]const int max = (int )1e5;int a[max],sum[max];void main(){    int n;    n = 35;    int a[] = { 1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9 ,1,2,3,4,5,6,7,8,9 ,1,2,3,4,5,6,7,8 };    for (int i = 0; i < n; i++)    {        if (i == 0)            sum[i] = a[i];        else            sum[i] = sum[i - 1] + a[i];    }    for (int i=1,j=1,k=1;i<n;i++)    //这几句语句比较巧妙。    {        while (first > second&&j < n) { j++; }        if (first != second) continue;        while (second > third&& k<n) k++;        if (second != third)continue;        if (first == second&&second == third &&third== four)            cout << "we found the divide" << endl;    }    cout << "end" << endl;}
原创粉丝点击