前書き:
この問題は簡単かもしれませんが、私は日本語の書き練習を兼ねて、日本語をコメントを入れて、自分の日本語能力を伸ばしたいという気持ちで一応こちらにメモを書いておきます。もし変な日本語や拙いコードを見つけたら、ご指導のほどよろしくお願いします。
本文:問題のリンク
与えられたM行xN列の二次元配列を左上から時計回りの順番で一つずつ取り出して、新たな一元配列に入力する。
編集:タイプミスの修正。
入力された3x3二次元配列:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
求められる出力の一元配列:
output = [1,2,3,6,9,8,7,4,5]
入力された3x4二次元配列:
matrix = matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
求められる出力の一元配列:
output = [1,2,3,4,8,12,11,10,9,5,6,7]
SpiralMatrixOrder.java
public List<Integer> spiralOrder(int[][] matrix) {
//二次元配列の行の始まりと終わりをtop,bottomに設定し、列の始まりと終わりをleft,rightに設定する。
int top=0,bottom=matrix.length-1,left=0,right=matrix[0].length-1;
//与えられた二次元配列の要素の数をゲットして、while文を終わらせる論理判断の基準として使う。
int elements=matrix.length*matrix[0].length;
//出力された要素を入れるリストの箱を用意する。
List<Integer> nums = new LinkedList<>();
//全べての要素を四つのfor文で取り切るまで繰り返し続ける。
while(true){
//一番上(0)の行の左端matrix[top][left]から右端[top][right]までtop行を行ごとで要素を取る。
for(int i=left;i<=right;i++){
//二次元配列から取った要素をリストに入れる。
nums.add(matrix[top][i]);
//一つ要素が取られたので、残りの要素数を一つ減らす。
elements--;
}
//もし残りの要素数が0になった途端、while文を終了。numsリストを返す。
if(elements==0)break;
//一番上の行が取り切ったので、topポインターを一つ下(+1)の行に移す。
top++;
//右端の列の頂点matrix[top][right]からどん底[down][right]までright列を列ごとで要素を取る。
for(int i=top;i<=bottom;i++){
nums.add(matrix[i][right]);
elements--;
}
if(elements==0)break;
//右端の列の要素が取り切ったので、rightポインターを一つ左(-1)の列に移す
right--;
//一番下の行の右端matrix[bottom][right]から左端[bottom][right]までbottom行を行ごとで要素を取る。
for(int i=right;i>=left;i--){
nums.add(matrix[bottom][i]);
elements--;
}
if(elements==0)break;
//一番下の行が取り切ったので、bottomポインターを一つ上(-1)の行に移す。
bottom--;
//matrix[bottom][left]からてっぺんの[top][left]まで左端left列を列ごとで要素を取る。
//一つのfor文が終わった後topがすぐ減ったので、スタート地点には行かない。
for(int i=bottom;i>=top;i--){
nums.add(matrix[i][left]);
elements--;
}
if(elements==0)break;
left++;///左端の列の要素が取り切ったので、leftポインターを一つ右(+1)の列に移す
//while文がtrue及びブレイク(中止)されない限り、一つ目のfor文から繰り返す。
}
//while文が執行終了後、入れ箱のnumsリストを返す。
return nums;
}