亚马逊在线笔试题:SpecialSubstring和elimination game

来源:互联网 发布:黑暗之魂3画面设置优化 编辑:程序博客网 时间:2024/05/16 08:00
import java.util.ArrayDeque;import java.util.HashMap;public class SpecialSubstring {/* * Question 1 / 2 (Amazon Campus(8): SpecialSubstring)   find the longest substring that has at most 3 different characters.   for example:   the special substring of "abbcddefghhh" is  "bbcdd". */static String findsubstring(String a) {if(a==null) return null;        HashMap<Integer,Integer> map = new HashMap<Integer, Integer>();        int len = a.length(), start=0, end=0, sublen = 0;        for(int i=0,j=0; i<len && j<len; j++){        int tail = a.charAt(j);        if(map.size()<3){//移动j        if(map.containsKey(tail))        map.put(tail, map.get(tail)+1);        else        map.put(tail, 1);        }else if(map.size()==3){        if(map.containsKey(tail))        map.put(tail, map.get(tail)+1);        else{//新的字符,移动i        while(map.size()==3){        int head = a.charAt(i++);        map.put(head, map.get(head)-1);        if(map.get(head)==0)        map.remove(head);        }        map.put(tail, 1);        }        }        //更新        if(j-i+1>sublen){        start = i;         end = j;         sublen=j-i+1;        }        }        if(sublen==0) return null;        else return a.substring(start, end+1);    }/* * Question 2 / 2 (Amazon Campus(8): elimination game)have you played the elimination game before? When you hit a rectangle, other rectangles which are adjacent and in same color will be cleared. We could use a n*m matrix to indicate the game board. Numbers in the matrix indicate different color. Same number means same color.For example: this is a 5*4 game board:1 1 2 42 3 3 32 2 3 53 3 3 31 2 3 4The matrix index starts from 0. After you hit the rectangle at (3, 3), all the adjacent rectangle with number 3 will be cleared. We use number 0 to mark the cleared rectangle. The result will be: 1 1 2 42 0 0 02 2 0 50 0 0 01 2 0 4Put gravity into consideration, rectangles which locates on top of the 0-rect will fall down and the result will be like this:0 0 0 01 0 0 02 1 0 42 2 0 51 2 2 4The question is, given a m*n matrix and a (x,y) indicate which rectangle is hit, compute the result of this hit.Input:4 // the number of the columns5 // the number of the rows1 1 2 4 // each line of the metrix. Number are separated by space.2 3 3 32 2 3 53 3 3 31 2 3 43 // the x index of the hit position3 // the y index of the hit positionOutput:0 0 0 0 1 0 0 02 1 0 42 2 0 51 2 2 4The output should be the matrix status line by line. Within each line, the numbers are separate by space. */static String[] GetEliminationResult(String[] matrixString, int numOfColumn, int numOfRow, int hitXIndex, int hitYIndex) {    /*    matrixString_size is the number of strings stored in the matrixString.     matrixString is an array of strings. Each string is a space seperated string like this "1 1 2 4".     It is a row of the matrix    numOfColumn: Number of the columns in the matrix    numOfRow: Number of rows in the matrix    hitXIndex: the x index of the hit position    hitYIndex: the y index of the hit position    */int[][] matrix = new int[numOfRow][numOfColumn];for(int i=0; i<numOfRow; i++){String[] row = matrixString[i].split(" ");for(int j=0; j<numOfColumn; j++)matrix[i][j]=Integer.parseInt(row[j]);}class IntPair{int x;int y;IntPair(int x, int y){this.x = x;this.y = y;}}int color = matrix[hitXIndex][hitYIndex];if(color!=0){ArrayDeque<IntPair> queue = new ArrayDeque<IntPair>();matrix[hitXIndex][hitYIndex]=0;queue.add(new IntPair(hitXIndex, hitYIndex));while(!queue.isEmpty()){IntPair cell = queue.poll();int ax = cell.x, ay = cell.y;if(ax+1<numOfRow){if(matrix[ax+1][ay]==color){matrix[ax+1][ay]=0;queue.add(new IntPair(ax+1, ay));}}if(ax-1>=0){ if(matrix[ax-1][ay]==color){matrix[ax-1][ay]=0;queue.add(new IntPair(ax-1, ay));}}if(ay+1<numOfColumn && matrix[ax][ay+1]==color){matrix[ax][ay+1]=0;queue.add(new IntPair(ax, ay+1));}if(ay-1>=0 && matrix[ax][ay-1]==color){matrix[ax][ay-1]=0;queue.add(new IntPair(ax, ay-1));}}}//shift matrixfor(int j=0; j<numOfColumn; j++){int z=numOfRow-1, i=z-1;while(true){while(z>=0 && matrix[z][j]!=0) z--;if(z < 0) break; i=z-1;while(i>=0 && matrix[i][j]==0) i--;if(i < 0) break;matrix[z--][j]=matrix[i][j];matrix[i--][j]=0;}}//return resultString[] res = new String[numOfRow];for(int i=0; i<numOfRow; i++){String row = ""+matrix[i][0];for(int j=1; j<numOfColumn; j++)row += " "+matrix[i][j];res[i] = row;}return res;}public static void main(String[] args){String a = "abbcddefghhh";System.out.println(findsubstring(a));String[] matrix = new String[]{"1 1 2 4","2 3 3 3","2 2 3 5","3 3 3 3","1 2 3 4"};String[] res = GetEliminationResult(matrix, 4, 5, 3, 3);for(String row : res)System.out.println(row);}}
bbcdd0 0 0 01 0 0 02 1 0 42 2 0 51 2 2 4