计算堆栈中的剩余数字

标题:计算堆栈中的剩余数字 | 时间限制:1秒 | 内存限制:32768K | 语言限制:不限
向一个空栈中依次存入正整数, 假设入栈元素n(1<=n<=2^31-1)按顺序依次为nx...n4、n3、n2、n1, 每当元素入栈时,如果n1=n2+...+ny(y的范围[2,x],1<=x<=1000),则n1~ny全部元素出栈,重新入栈新元素m(m=2*n1)。
如:依次向栈存入6、1、2、3, 当存入6、1、2时,栈底至栈顶依次为[6、1、2];当存入3时,3=2+1,3、2、1全部出栈,重新入栈元素6(6=2*3),此时栈中有元素6;因为6=6,所以两个6全部出栈,存入12,最终栈中只剩一个元素12。

import java.util.Scanner;
import java.util.Stack;

public class Main {

    static Stack<Long> stack = new Stack<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String line = sc.nextLine();

        String[] strNumbers = line.split(" ");
        int[] numbers = new int[strNumbers.length];

        for (int i = 0; i < strNumbers.length; i++) {
            numbers[i] = Integer.parseInt(strNumbers[i]);
        }

        for (int i = 0; i < numbers.length; i++) {
            tryToPush(numbers[i]);
        }

        StringBuilder result = new StringBuilder();
        while (!stack.empty())
            result.append(stack.pop()).append(" ");
        System.out.println(result.toString().trim());

    }

    static void tryToPush(long num) {
        long temp = 0;
        for (int i1 = stack.size() - 1; i1 >= 0; i1--) {
            temp += stack.get(i1);
            if (temp == num) {
                int stackSize = stack.size();
                for (int j = i1; j < stackSize; j++) {
                    stack.pop();
                }
                tryToPush(temp * 2);
                return;
            } else if (temp > num) {
                break;
            }
        }
        stack.push(num);
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    public class Program
    {
        public static long MyPow(long x, long y)
        {
            long output = 1;
            if (y == 0) return 1;
            for (long i = 1; i <= y; i++)
            {
                output *= x;
            }
            return output;
        }

        public static bool ShouldPop(IEnumerable<long> numbers, long num, out int popAt)
        {
            if (numbers == null || numbers.Count() <= 0)
            {
                popAt = -1;
                return false;
            }
            long sum = 0;
            for (int i = 0; i <= numbers.Count() - 1; i++)
            {
                long currNumber = numbers.ElementAt(i);
                sum += currNumber;

                if (sum < num)
                {
                    continue;
                }

                if (sum > num)
                {
                    popAt = -1;
                    return false;
                }

                if (sum == num)
                {
                    popAt = i;
                    return true;
                }
            }

            popAt = -1;
            return false;
        }

        public static void Main(string[] args)
        {
            string input = Console.ReadLine();
            string[] numbers = input.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
            if (numbers.Length > 1000 || numbers.Length < 1)
            {
                Console.WriteLine();
                return;
            }
            Stack<long> intStack = new Stack<long>();

            for (int i = 0; i <= numbers.Length - 1; i++)
            {
                if (!long.TryParse(numbers[i], out long currNumer))
                {
                    Console.WriteLine();
                    return;
                }
                else
                {
                    if (currNumer < 1 || currNumer > MyPow(2, 31) - 1)
                    {
                        Console.WriteLine();
                        return;
                    }
                    int popAt = -1;
                    while (ShouldPop(intStack, currNumer, out popAt))
                    {
                        for (int j = 0; j <= popAt; j++)
                        {
                            intStack.Pop();
                        }
                        currNumer = currNumer * 2;
                    }            
                    //题干中规定入栈元素属于[1,2^31-1], 此处若考虑m是否符合该条件则有测试用例无法通过
                    //if (currNumer > int.MaxValue)
                    //{
                    //    Console.WriteLine();
                    //    return;
                    //}               
                    intStack.Push(currNumer);
                }
            }

            string output = string.Empty;
            while (intStack.Count() > 0)
            {
                output += intStack.Pop() + " ";
            }

            Console.WriteLine(output.Trim());
        }
    }
}


全部评论

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务