【问题标题】:IsFibo not returning desired resultIsFibo 没有返回想要的结果
【发布时间】:2015-03-17 18:08:45
【问题描述】:

这是我为 IsFibo HackerRank 问题想到的一个解决方案。 (https://www.hackerrank.com/challenges/is-fibo)。我想知道为什么它不会为 5 返回“IsFibo”。我的逻辑可能有问题,如果有人指出我的错误,我将不胜感激。代码如下:

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
    public static ArrayList<BigInteger> fibList = new ArrayList<BigInteger>();

    public static void main(String[] args) {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner in = new Scanner(System.in);
        int numCases = in.nextInt();

        fibList.add(BigInteger.valueOf(0));
        fibList.add(BigInteger.valueOf(1));

        while(in.hasNextLine()) {
            System.out.println(checkFibo(in.nextBigInteger()));
            System.out.println(fibList);
        }
    }

    public static String checkFibo(BigInteger i) {
        int lastIndex = fibList.size() - 1;
        int compareRes = i.compareTo(fibList.get(lastIndex));

        System.out.println("Last fib num: " + fibList.get(lastIndex));
        System.out.println("CompareRes: " + compareRes);

        switch(compareRes) {
            case 0:
                return "IsFibo";
            case 1:
                BigInteger newFib = fibList.get(lastIndex-1).add(fibList.get(lastIndex));
                fibList.add(newFib);
                checkFibo(i);
                break;
            default:
                break;
        }

        return "IsNotFibo";

    }
}

【问题讨论】:

    标签: java fibonacci


    【解决方案1】:

    您的代码有两个问题:

    1. 案例 1:不回传递归调用的返回值
    2. 默认实现的 case -1 将被完全忽略(即代码在处理较大的输入后无法处理较小的输入)

    这是一个有效的代码:

    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Solution {
        public static ArrayList<BigInteger> fibList = new ArrayList<BigInteger>();
    
        public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
            Scanner in = new Scanner(System.in);
    
            fibList.add(BigInteger.valueOf(0));
            fibList.add(BigInteger.valueOf(1));
    
            while(in.hasNextLine()) {
                BigInteger nextBigDecimal = in.nextBigInteger();
                System.out.println("input:" + nextBigDecimal);
                System.out.println("isFibo: " + checkFibo(nextBigDecimal));
                System.out.println(fibList);
            }
        }
    
        public static boolean checkFibo(BigInteger i) {
            int lastIndex = fibList.size() - 1;
            int compareRes = i.compareTo(fibList.get(lastIndex));
    
            System.out.println("Last fib num: " + fibList.get(lastIndex));
            System.out.println("CompareRes: " + compareRes);
    
            boolean isFibo = false;
    
            switch(compareRes) {
                case 0:
                    isFibo = true;
                    break;
                case 1:
                    BigInteger newFib = fibList.get(lastIndex-1).add(fibList.get(lastIndex));
                    fibList.add(newFib);
                    isFibo = checkFibo(i);
                    break;
                case -1:
                    isFibo = fibList.contains(i);
                    break;
            }
            return isFibo;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 1970-01-01
      • 2016-03-14
      • 2021-08-29
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多