• 1002 A+B for Polynomials (25分)


    问题

    This time, you are supposed to find A+B where A and B are two polynomials.(多项式相加)。

    解决思路

    1. 一开始打算用数组来解决这个问题,但是在算法流程的时候发现有的问题我解决不了。算法流程如下:

     因为这个是因为的题目,所以我没有理解到其中一句话。就是"K is the number of nonzero terms in the polynomial",我翻译的是K 非零,但是别人的意思是非零项的个数。所以我就不敢把系数等于0作判断条件。所以我直接把每一项都输出了。
    整个算法我也实现了,用的java,但是分数只得到一点点。有想法的兄弟可以帮我改一改。

    import java.util.Scanner;
    class Main{
        public static void main(String[] args)
        {
            int N1,N2; //一共有多少项
            int a1,b1;//最大项
            int t;
            Scanner dataIn = new Scanner(System.in);
            N1 = dataIn.nextInt();
            t = a1 = dataIn.nextInt();
            double[] A = new double[a1+1];
            A[t] = dataIn.nextDouble();
            for(int i=1;i<N1;i++)
            {
                t = dataIn.nextInt();
                A[t] = dataIn.nextDouble();
                
            }
            N2 = dataIn.nextInt();
            t = b1 = dataIn.nextInt();
            double[] B = new double[b1+1];
            B[t] = dataIn.nextDouble();
            for(int i=1;i<N2;i++)
            {
                t = dataIn.nextInt();
                B[t] = dataIn.nextDouble();
                
            }  
            
            //交换赋值
            if(a1<b1)
            {
                double[] td;
                int ti;
                td = B;
                B = A;
                A = td;
                ti = b1;
                b1 = a1;
                a1 = ti;
            }
            t =a1+1;
            System.out.print(t);
            for(int i=a1;i>=0;i--)
            {
                
                if(b1>=i)
                {
                    A[i] += B[i];
                }
                System.out.print(" "+ i +" "+A[i]);
            }
            System.out.println();
        }
    }
    
    1. 因为才学习java所以可能之后自己在做算法题的时候都会优先选择java,但是我其实觉得C/C++来做这个编程题会更有感觉。没办法谁让自己是java初学者呢。所以,因为上面的代码行不通我就想,到了java里面的HashMap类,这个我就不贴算法流程了。直接看代码:
          import java.util.Scanner;
    import java.util.Set;
    import java.util.HashMap;
    import java.util.Map.Entry;
    public class Main
    {
        public static void main(String[] args)
        {
            int K1,K2;                                              //一共有多少项
            HashMap<Integer,Double> res = new HashMap<Integer,Double>();          //Hash表存储相关加数
            Scanner scanner = new Scanner(System.in);               //控制台输入
            K1 = scanner.nextInt();
            for(int i=K1;i>0;i--)
            {
                res.put(scanner.nextInt(),scanner.nextDouble());
            }
            K2 = scanner.nextInt();
            for(int i=K2;i>0;i--)
            {
                Integer term = scanner.nextInt();
                if(res.containsKey(term))
                {
                    Double j = res.get(term);
                    j += scanner.nextDouble();
                    res.put(term,j);
                }
                else
                {
                    res.put(term,scanner.nextDouble());
                }
            }
            System.out.print(res.size());
            Set<Integer> keys = res.keySet();   //获得键值集合
            Object[] keyArr = keys.toArray();
            for(int i=(keyArr.length-1);i>=0;i--)
            {
                Integer t = (Integer)keyArr[i];
                System.out.printf(" %d %.1f",t,res.get(t));
            }
            System.out.println();
        }
    }
    

     当这个代码也有问题,可是我没有管它了。因为我发现这个代码运行在PAT时连答案问题类型提示都会发生改变。希望这份代码也可以被哪一位大佬改一下。
    3.最后我就在网上找了一份代码,然后通过了。算法流程如下:

    总结:

    我总是想着要少占一点空间,所以总是选择用时间来换空间的算法,但是很明显有的时候这个是不需要的。就像这道题,直接定义一个最大容量的数组。后面的算法就会很简单,整个代码也很优美。

  • 相关阅读:
    SQL Server 锁升级(Lock Escalations)
    Linux 输入与输出重定向详解
    MySQL DDL的成本高低
    spring 学习-bean创建-refresh方法
    spring 学习-bean创建-scan扫描bean
    spring 学习-bean创建-重要类介绍
    zkclient大量节点事件导致CPU飙升
    spring 学习-bean创建-重要类介绍
    ElasticSearch 按值排序
    Redis set 详解
  • 原文地址:https://www.cnblogs.com/kadcyh/p/14354174.html
Copyright © 2020-2023  润新知