CodeJam KickStart 2017--The Pancake Problem

将生产线上的面饼都翻至笑脸面

摸了一个星期的鱼…果然一放假就皮痒要懈怠…看来周末还是不能经常回家,老老实实呆学校里学习好了。

言归正传,之前谷歌办公室打电话来问我要不要试着申请一下他们的暑期实习…然后我跟着网申步骤发现…还要面试啊qaq我这个编程渣可怎么办,简历都不敢投了…但是还是翻了个小墙试着看了一下往年的题目。这大概是2017年某一个round的题…

题目大概意思就是,你有一个一次能翻连续k个薄饼的锅子,他们翻完顺序还是不变,但是只是正反面改变了。在队列头和尾处也一定要翻到k个饼,不能说将锅子的某一格不用上。完整题目如下:
在这里插入图片描述在这里插入图片描述
这道题和数学系的小伙伴一起研究了一下,据说是可以严格证明没有其他讨巧的解题算法的。那么就明确的去使用暴力解法,从第一个"-"的面饼开始翻就好了,如果翻到最后没有留下“-”面的面饼,那么就输出我们共翻了多少次,因此要准备一个counter 。如果最后一个 为“-”面,那么当我们试图用 k的锅去翻的时候,肯定就越界了,因此需要加一个判断s[i] == '-'&& i + k > s.length

思路很简单,基本上就是两个for循环慢慢检索过去,再加上一些判断。

刚开始写完的时候发现尴尬的是,因为输出那个counter的值,放在循环里面么打印好几遍,放在循环外面么,就算是结果是impossible也会输出一个不需要的counter。解决方法是当判断出是“impossible”的时候就将counter置为负数然后break,打印的时候再加一个判断就好。

import java.io.*;
import java.util.Scanner;

public class Pancake {
    public void Invert(char[] s, int k) {
        int count = 0;
        for (int i = 0; i < s.length; i++) {
            if (s[i] == '-'&& i + k > s.length) {
                System.out.println("Impossible");
                count=-1;
                break;
            }else if (s[i] == '-') {
                count++;
                for (int j = 0; j < k; j++) {
                    if (s[i + j] == '-') {
                        s[i + j] = '+';
                    } else {
                        s[i + j] = '-';
                    }
            }
        }
    }
        if(count>0)
            System.out.println(count);
}

刚开始为了检查方便,将输入的薄饼队列和锅的大小初始化了一下。
以下是主函数

public static void main (String[] args){
        Pancake cake=new Pancake();
        char ss[]={'+','-','-','+','-','-'};
        int k=3;
        cake.Invert(ss,k);
    }

后来控制台输入的时候用了bufferedreader不知道哪里错了,没有输出,但是不报错…懒得debug,就换了scanner…然后就OK了…读完记得要把它用.close()关掉

    public static void main (String[] args){
      Pancake cake=new Pancake();
      Scanner read=new Scanner(System.in);
      System.out.print("input_k ");
      int K=read.nextInt();
      System.out.print("input_the_pancake_line ");
      String ss=read.next();
      char[] s=ss.toCharArray();
      cake.Invert(s, K);
      read.close();
    }

后来还是去查了一下,出错原因在于我读k的时候用的是.read()改用readline()大概就没问题了。read()函数一般用来表示文件结束,当他返回-1的时候。当时如果要用bufferedreader的话应该写为int k=Integer.parseInt(str.readLine());Integer是int数据类型在java中的包装类,当其他数据类型转换成int的时候 用Integer来转。所以这个bufferead 函数一般是用在读file文件的…

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值