将生产线上的面饼都翻至笑脸面
摸了一个星期的鱼…果然一放假就皮痒要懈怠…看来周末还是不能经常回家,老老实实呆学校里学习好了。
言归正传,之前谷歌办公室打电话来问我要不要试着申请一下他们的暑期实习…然后我跟着网申步骤发现…还要面试啊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文件的…