//update This is the right sln which takes care of the negative and sequence building..
        private SequenceSum FindMaxSumAndSequence2(int[] array)
        {
            //we can intialize to 0 but to handle negative number, i set it to min int
            int           maxsum      = Int32.MinValue;
            int           sum         = 0;
            StringBuilder sequence    = new StringBuilder();
            string        maxsequence = string.Empty;

            for (int i = 0; i < array.Length; i++)
            {
                sum = sum + array[i];
                sequence.Append(array[i]).Append(",");

                if (maxsum < sum)
                {
                    maxsum      = sum;
                    maxsequence = sequence.ToString();
                }
                else if (sum < 0)
                {
                    sum = 0;  //reset sum to 0 when the sum value is negative
                    sequence.Clear();
                }
            }

            SequenceSum result = new SequenceSum();

            result.MaxSum   = maxsum;
            result.Sequence = maxsequence.ToString();
            return(result);
        }
        private void button6_Click(object sender, EventArgs e)
        {
            int[]       input  = AlgorithmHelper.ConvertCommaSeparetedStringToInt(this.textBox11.Text);
            SequenceSum result = FindMaxSumAndSequenceWithAllNegativeHandle(input);

            this.textBox10.Text = result.MaxSum.ToString();
            this.textBox12.Text = result.Sequence;
        }
Пример #3
0
        public void SequenceSum_Test_0()
        {
            int input = 0;

            int[] expected = new int[] { 0 };

            int[] actual = SequenceSum.SumOfN(input);

            CollectionAssert.AreEqual(expected, actual);
        }
Пример #4
0
        public void SequenceSum_Test_Neg7()
        {
            int input = -7;

            int[] expected = new int[] { 0, -1, -3, -6, -10, -15, -21, -28 };

            int[] actual = SequenceSum.SumOfN(input);

            CollectionAssert.AreEqual(expected, actual);
        }
Пример #5
0
        public void SequenceSum_Test_NegativeFour()
        {
            int input = -4;

            int[] expected = new int[] { 0, -1, -3, -6, -10 };

            int[] actual = SequenceSum.SumOfN(input);

            CollectionAssert.AreEqual(expected, actual);
        }
Пример #6
0
        public void SequenceSum_Test_Ten()
        {
            int input = 10;

            int[] expected = new int[] { 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 };

            int[] actual = SequenceSum.SumOfN(input);

            CollectionAssert.AreEqual(expected, actual);
        }
        //Logic: Maintain the maxsum value and sum value
        //remember to reset sum to zero when the sum value is lesser than 0 bcoz when the negative value comes as sum..if we add to another negative worse sum or to positive still lesser than positive value
        //Consider the scenario when the array contains all negative numbers..possible options 0, larger of negative or min_int..discuss with interviewer
        private SequenceSum FindMaxSumAndSequenceWithAllNegativeHandle(int[] array)
        {
            //we can intialize to 0 but to handle negative number, i set it to min int
            int           maxsum          = Int32.MinValue;
            int           sum             = 0;
            bool          skippedsequence = false;
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < array.Length; i++)
            {
                sum = sum + array[i];
                //only if the sum is greater than 0 append...ie build the sequence
                if (sum > 0)
                {
                    sb.Append(array[i]).Append(",");
                }

                if (maxsum < sum)
                {
                    //Handle for negative number
                    //if the maxsum is already negative and the new sum is greater than maxsum..clear the sb
                    if (maxsum < 0 || (skippedsequence == true))
                    {
                        sb.Clear();
                        sb.Append(array[i]).Append(",");
                        skippedsequence = false;
                    }
                    maxsum = sum;
                }
                if (sum < 0)
                {
                    sum = 0;  //reset sum to 0 when the sum value is negative

                    //if sum is negative and maxsum is positive then we are skipped the number in sequence
                    //so we have to clear when we find the highest
                    if (maxsum > 0)
                    {
                        skippedsequence = true;
                    }
                }
            }

            SequenceSum result = new SequenceSum();

            result.MaxSum   = maxsum;
            result.Sequence = sb.ToString();
            return(result);
        }