您的位置:首页 > 编程语言 > Go语言

Google-APAC2015-"super 2048"

2014-10-30 05:52 267 查看
今天得知Sitong拿到了FB和Google的offer,觉得很强,恭喜恭喜。自己还得加把劲啊!

宇妹(这里宇妹和托雷斯“托妞”是一种概念 =W=)说春季想跳槽到LinkedIn,于是呼唤我和他一起刷Leetcode。我愉快地答应了。熟能生巧嘛。

早上和Parker聊了一下,他说他prefer中型公司,比如dropbox, LinkedIn,因为小公司的package好、可以学到更多东西而且可能IPO。大神果然是比我们高到不知道哪里去了。

下午在Silo写代码,很快就把2048这道题目写好了,没什么难度,上题:

原题:super 2048

=====================================

#1 题目理解:

N * N的2048游戏,然后给定移动方向,输出移动结果。(= 。=,如果没有玩过这个游戏赶紧去google一下2048)

一看题目的描述就知道是中国人写的,因为里面用了(no zuo no die),哈哈哈。果然是google在中国区的招聘题目,这么接地气。

=====================================

#2 算法:

这道题目还是挺简单明了的:

假设DIR == RIGHT,设定行指针是i,非空列指针是j,元素指针是p1, p2。

从右到左开始搜索,遇到非零元素,赋值p1;再次遇到,赋值p2。

只有p1 != null && p2 != null才继续操作。

如果&p1 == &p2,那么加起来,&j = &p1 + &p2,j--,把p1设为p2前一个。

如果&p1 != &p2,&j = &p1, j--,把p1设为p2。

记得把剩下的那个p1放到对应的 “ j ” 处。

=====================================

#3 数据结构:

int[][] board

=====================================

#4 代码:

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

public class Solution {
public static void main(String[] args) {
File inFile = new File("B-large-practice.in");
File outFile = new File("B-large-practice.out");
try {
BufferedReader br = new BufferedReader(new FileReader(inFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(outFile));
int T = Integer.parseInt(br.readLine());
for (int i = 1; i <= T; i++) {
String line = br.readLine();
String[] parts = line.split("\\s");
int N = Integer.parseInt(parts[0]);
String DIR = parts[1];
String[] lines = new String
;
for (int j = 0; j < N; j++) {
lines[j] = br.readLine();
}
int[][] board = getBoard(lines);
bw.write("Case #" + i + ":\n" + solve(N, DIR, board));
}
bw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

// solve the super-2048
public static String solve(int N, String DIR, int[][] board) {
String s = "";
switch(DIR) {
case "up":
s = up(N, board);
break;
case "down":
s = down(N, board);
break;
case "left":
s = left(N, board);
break;
case "right":
s = right(N, board);
break;
default:
break;
}
return s;
}

// move right
public static String right(int N, int[][] board) {
for (int i = 0; i < N; i++) {
int j = N-1;
int p1 = N-1;
int p2;
while (true) {
while (p1 >= 0 && board[i][p1] == 0) p1--;
if (p1 < 0) break;
p2 = p1 - 1;
while (p2 >= 0 && board[i][p2] == 0) p2--;
if (p2 < 0) break;
if (board[i][p1] == board[i][p2]) {
board[i][j] = 2 * board[i][p1];
p1 = p2 - 1;
}
else {
board[i][j] = board[i][p1];
p1 = p2;
}
j--;
}
if (p1 >= 0) {
board[i][j] = board[i][p1];
j--;
}
while (j >= 0 && j < N) {
board[i][j] = 0;
j--;
}
}
return boardToStr(board);
}

// move left
public static String left(int N, int[][] board) {
for (int i = 0; i < N; i++) {
int j = 0;
int p1 = 0;
int p2;
while (true) {
while (p1 < N && board[i][p1] == 0) p1++;
if (p1 >= N) break;
p2 = p1 + 1;
while (p2 < N && board[i][p2] == 0) p2++;
if (p2 >= N) break;
if (board[i][p1] == board[i][p2]) {
board[i][j] = 2 * board[i][p1];
p1 = p2 + 1;
}
else {
board[i][j] = board[i][p1];
p1 = p2;
}
j++;
}
if (p1 < N) {
board[i][j] = board[i][p1];
j++;
}
while (j >= 0 && j < N) {
board[i][j] = 0;
j++;
}
}
return boardToStr(board);
}

// move down
public static String down(int N, int[][] board) {
for (int j = 0; j < N; j++) {
int i = N-1;
int p1 = N-1;
int p2;
while (true) {
while (p1 >= 0 && board[p1][j] == 0) p1--;
if (p1 < 0) break;
p2 = p1 - 1;
while (p2 >= 0 && board[p2][j] == 0) p2--;
if (p2 < 0) break;
if (board[p1][j] == board[p2][j]) {
board[i][j] = 2 * board[p1][j];
p1 = p2 - 1;
}
else {
board[i][j] = board[p1][j];
p1 = p2;
}
i--;
}
if (p1 >= 0) {
board[i][j] = board[p1][j];
i--;
}
while (i >= 0 && i < N) {
board[i][j] = 0;
i--;
}
}
return boardToStr(board);
}

// move up
public static String up(int N, int[][] board) {
for (int j = 0; j < N; j++) {
int i = 0;
int p1 = 0;
int p2;
while (true) {
while (p1 < N && board[p1][j] == 0) p1++;
if (p1 >= N) break;
p2 = p1 + 1;
while (p2 < N && board[p2][j] == 0) p2++;
if (p2 >= N) break;
if (board[p1][j] == board[p2][j]) {
board[i][j] = 2 * board[p1][j];
p1 = p2 + 1;
}
else {
board[i][j] = board[p1][j];
p1 = p2;
}
i++;
}
if (p1 < N) {
board[i][j] = board[p1][j];
i++;
}
while (i >= 0 && i < N) {
board[i][j] = 0;
i++;
}
}
return boardToStr(board);
}

// convert board into string
public static String boardToStr(int[][] board) {
int N = board.length;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(board[i][j] + " ");
}
sb.append("\n");
}
return sb.toString();
}

// convert the string into board
public static int[][] getBoard(String[] lines) {
int N = lines.length;
int[][] board = new int

;
for (int i = 0; i < N; i++) {
String[] parts = lines[i].split("\\s");
for (int j = 0; j < N; j++) {
board[i][j] = Integer.parseInt(parts[j]);
}
}
return board;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  google-apac 算法 java