题解 | #牛牛的旗语传递#
牛牛的旗语传递
https://www.nowcoder.com/practice/810b1c80a9c341c4af69facac350d6bc
- 题目考察的知识点
字符串,矩阵变换
- 题目解答方法的文字分析
设 nnn 为字符串 sss 的长度,r=numRows。对于 r=1(只有一行)或者 r≥n(只有一列)的情况,答案与 s相同,我们可以直接返回 sss。对于其余情况,考虑创建一个二维矩阵,然后在矩阵上按 Z 字形填写字符串 sss,最后逐行扫描矩阵中的非空字符,组成答案。
- 本题解析所用的编程语言
java
- 完整且正确的编程代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param numRows int整型
* @return string字符串
*/
public String decodeFlag (String s, int numRows) {
int n= s.length(),r=numRows;
//对于 r=1(只有一行)或者 r≥n(只有一列)的情况,答案与 s相同,我们可以直接返回 s。
if(r==1||r>=n){
return s;
}
//创建一个二维矩阵,然后在矩阵上按 Z 字形填写字符串 s,最后逐行扫描矩阵中的非空字符,组成答案。
int t=r*2-2;
int c=(n+t-1)/t*(r-1);
char[][] mat = new char[r][c];
for(int i=0,x=0,y=0;i<n;i++){
mat[x][y]= s.charAt(i);
if(i%t<r-1){
x++;//向下
}else{
x--;
y++;//向右上
}
}
//逐行扫描矩阵中的非空字符,组成答案
StringBuilder ans = new StringBuilder();
for(char[] row : mat){
for(char ca:row){
if(ca!=0){
ans.append(ca);
}
}
}
return ans.toString();
}
}