当前位置: 首页 > 面试题库 >

Spotify拼图问题

路阳华
2023-03-14
问题内容

我正在尝试解决此页面上描述的“之前最好的”
Spotify难题。基本上,如果输入的三个整数之间用斜杠(例如11/3/4)隔开,则应该以最早的日期以2011-03-04格式生成输出。如果没有日期,则应返回原始字符串,后跟“
is非法”。

我下面的解决方案的想法是从我在github上发现相同问题的Python解决方案中借来的。当我提交此Python代码时,它被接受。不熟悉Python,这是我最好的尝试,以使Java与Java类似,并且不使用任何Calendar功能处在发布的解决方案所示)。

但是,当我提交解决方案时,会收到“错误答案”作为答复。请尽量尝试,此代码找不到任何错误。我觉得我已经尝试了每种可能的输入组合,而我的所有输出都正确地输出了。有人知道我可能会缺少什么吗?

由于我一般对编程还比较陌生,因此如果愿意,也可以就如何改进代码提出建议。我敢肯定,它看起来似乎有点笨拙。谢谢!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class DateProggy3 {

    static int var1, var2, var3;
    static int slashPosition1, slashPosition2;
    static String yearString, monthString, dayString;

    public static void main(String[] args) throws IOException {
        String dateInput = readDate();
        splitInputToInts(dateInput);
        Integer[] dateArray = {var1, var2, var3};
        Arrays.sort(dateArray);
        Integer bestDate[] = getBestDate(dateArray, dateInput);
        convertDate(bestDate);
        printDate(bestDate);
    }

    public static String readDate() throws IOException {
        BufferedReader stdin = new BufferedReader
          (new InputStreamReader(System.in));
        String dateInput; 
        dateInput = stdin.readLine();
        return dateInput;
    }

    public static void splitInputToInts(String dateInput) {
        try {
        slashPosition1 = dateInput.indexOf('/');
        slashPosition2 = dateInput.lastIndexOf('/');
        var1 = Integer.parseInt(dateInput.substring(0, slashPosition1));
        var2 = Integer.parseInt(dateInput.substring(slashPosition1+1, slashPosition2));
        var3 = Integer.parseInt(dateInput.substring(slashPosition2+1, dateInput.length()));
        }catch (StringIndexOutOfBoundsException e){
            illegal(dateInput);
        }catch (NumberFormatException e){
            illegal(dateInput);
        }
    }

    public static void illegal(String dateInput){
        System.out.println(dateInput + " is illegal");
        System.exit(0); 
    }

    public static Integer[] getBestDate(Integer[] dateArray, String dateInput){
        var1 = dateArray[0];
        var2 = dateArray[1];
        var3 = dateArray[2];
        if (testDate(var1, var2, var3)){
            Integer[] bestDate = {var1, var2, var3};
            return bestDate;
        }
        else if (testDate(var1, var3, var2)){
            Integer[] bestDate = {var1, var3, var2};
            return bestDate;
        }
        else if (testDate(var2, var1, var3)){
            Integer[] bestDate = {var2, var1, var3};
            return bestDate;
        }
        else if (testDate(var2, var3, var1)){
            Integer[] bestDate = {var2, var3, var1};
            return bestDate;
        }
        else if (testDate(var3, var1, var2)){
            Integer[] bestDate = {var3, var1, var2};
            return bestDate;
        }
        else if (testDate(var3, var2, var1)){
            Integer[] bestDate = {var3, var2, var1};
            return bestDate;
        }else{
            illegal(dateInput);
        }
        Integer[] bestDate = {var1, var2, var3};
        return bestDate;
    }

    public static boolean testDate(int year, int month, int day){
        boolean leapYear = false;
        boolean dateOK;
        if (year > 100 && year < 2000){
            return dateOK = false;
        }
        if (year < 1000){
            year+=2000;
        }
        if (year < 0){
            return dateOK = false;
        }
        if (year % 4 == 0) {
            if (year % 100 == 0 && year % 400 != 0) {
                leapYear = false; 
            }
            leapYear = true;
        }else{
            leapYear = false;
        }
        if (month > 12 || month < 1){
            return dateOK = false;
        }
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                if (day > 31 || day < 1){
                    return dateOK = false;
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                if (day > 30 || day < 1){
                    return dateOK = false;
                }
                break;
            case 2:
                int maxDay;
                if (leapYear){
                    maxDay = 29;
                }else{
                    maxDay = 28;
                }
                if (day > maxDay || day < 1){
                    return dateOK = false;
                }
        }
        return dateOK = true;
    }


    public static void convertDate(Integer[] dateArray){
        if (dateArray[0] < 1000){
            dateArray[0]+=2000; 
        }
        yearString = String.valueOf(dateArray[0]); 
        if (dateArray[1] < 10){ 
            monthString = "0" + dateArray[1];
        }else{
            monthString = String.valueOf(dateArray[1]);
        }
        if (dateArray[2] < 10){
            dayString = "0" + dateArray[2];
        }else{
            dayString = String.valueOf(dateArray[2]);
        }
    }

    public static void printDate(Integer[] dateArray){
        System.out.println(yearString + "-" + monthString +"-" + dayString);
    }
}

我是问这个问题的人,但是由于我注册到并丢失了我的原始Cookie或其他内容,因此似乎再也无法对评论做出正常答复。

无论如何,谢谢palacsint的回答。我解决了the年的问题,现在我的答案终于被接受了!

有关方法中最后两行的问题getBestDate()。我把它们放在那儿只是因为Eclipse IDE否则给我错误“此方法必须返回Integer
[]类型的结果”。将所有回报都放在if方括号中似乎并不满意。有没有办法解决?谢谢。


问题答案:

一个错误:它接受2100/02/29。2100年 不是 a年,所以没有2011/02/29。

如果我是您,则将SimpleDateFormat用于解析和验证(提示:lenient解析)。它更简单,更直观,代码也更容易阅读。(不要重新发明轮子)

以上是其他一些想法。

不必要的分配:return dateOK = false;

只需返回false

return false;

dataOK在您的情况下,该变量是不必要的。)

public static void illegal(String dateInput){
    System.out.println(dateInput + " is illegal");
    System.exit(0); 
}

抛出异常而不是System.exit()

在该getBestDate()方法中,最后两行永远不会运行。它们是无效代码(由于illegal()调用System.exit()):

}else{
    illegal(dateInput);
}

Integer[] bestDate = {var1, var2, var3};
return bestDate;

如果可能,请避免使用静态方法和字段。最后,学习如何编写单元测试是一个好问题。



 类似资料:
  • 实现拼图游戏的效果,手指移动图片很流畅。 [Code4App.com]

  • 拼图 Pintuer.com:国内优秀的HTML、CSS、JS跨屏响应式开源前端框架,使用最新浏览器技术,为快速的前端开发提供一系统的文本、图标、媒体、表格、表单、按钮、菜单、网格系统等样式工具包,占用资源小,使用拼图可以快速构建简洁、优雅而且自动适应手机、平板、桌面电脑等设备的前端界面,让前端开发像玩游戏一下快乐而轻松。 拼图前端框架在传统CSS框架的基本上,增加了HTML5、CSS3、JS等技

  • 我已经做了一段时间了,我想看看是否有人知道我可能做错了什么。我想做的是使用提供的Spotify Web API将歌曲添加到播放列表中。根据这方面的文件https://developer.spotify.com/documentation/web-api/reference/playlists/add-tracks-to-playlist/我需要确定用户的范围。 “将曲目添加到当前用户的私人播放列表

  • 我的背景: 9-ea-113(这是javafx现在完全模块化,没有jfrt.jar) eclipse-neon-M6与当前的测试版支持java9(运行在java8上,如果这很重要) win7 简单地说 没有编译,因为javafx。找不到xx个包。 要怎么做?

  • 有俩张管道的图片但是因为管道是圆的导致成像板的图片灰度值不一样,中间的灰度值高,俩边的灰度值低。拼出来的图像在拼接出来的图像有明显的黑条有什么解决办法? 无

  • 我运行了这段代码。结果似乎没有生成result.png: 并且误差为