LeetCode-N字型变换

 利用二维矩阵模拟:

利用二维矩阵模拟的思路就是创建一个二维数组,将给到的字符串按照N型顺序存储到二位数组中,然后再二位数组中检索获得转换后的字符串,而再这其中的有两个值得注意的地方:1.创建的二维数组如何确定大小,2.如何将字符串按照N型存入数组中。

1.创建存入字符串的二维数组:

在创建二维数组的数组的行数很容易确定,就是方法中给定的参数numRows,但是这里的列数就不是很好确定了,但是经过观察发现转换后的N型字符可以通过分组确定列数,这里的分组就是将转换成的N型按照一列和下一列前面的倾斜的一串字符分为一组,这样N型字符就总是可以分成整组数和一个不是完整的组数,这样我们只要知道一组有多少列,那一个不完整的组数有多少列和一共有多少组我们就可以计算出我们创建的二维数组一共有多少列。

通过观察上面的N型排列可以发现一组总是有numRows+numRows-2个字符,一组有1+numRows-2列,所以我们我们可以通过下面的方法计算的到列数:

            int groupNumber=s.length()/group;//整组数
            int other=s.length()%group;//剩下不能为一组的字母数
            int line=(numRows-1)*groupNumber;//整组数的列数
            if(other!=0)
            {
                line+=1;
                if(other>numRows)
                {
                    line+=other%numRows;
                }
            }//不为整组数中的列数加入line中

 值得注意的是在对不是整组数中的列数处理时,若其字符数量小于等于numRows时列数只需要加一,当其字符数量大于numRows时就需要再加上其超过的字符数量

2.将字符按照N型放入二维数组中:

将字符按照N型放入二维数组中其实并没有什么难度,其核心思想也是需要按照组的顺序写入二维数组中,就是每次存入一组数组,然后循环存入,再这里需要注意的时再循环存入时不要超出二维数组的范围。按照下面的方法就可以将字符串存入数组

            char [][]temp=new char[numRows][line];//定义数组用于存储字符串
            for(int i=0;i<temp.length;i++)
            {
                for(int j=0;j<temp[0].length;j++)
                {
                    temp[i][j]=' ';
                }
            }
            for(int i=0,k=0;i<s.length();)
            {
                int j=0;
                if(k>=temp[0].length)
                {
                    break;
                }
                for(;j<numRows&&i<s.length()&&k<temp[0].length;j++,i++)
                {
                    temp[j][k]=s.charAt(i);
                }
                j-=2;
                k++;
                for(;j>0&&i<s.length()&&k<temp[0].length;j--,k++,i++)
                {
                    temp[j][k]=s.charAt(i);
                }//每次循环往数组里面存入一组数据
            }//循环存入数组

这里获取字符串的单个字符使用了s.charAt(i)的方法。再创建二维数组的时候二维数组里面的字符默认为空白,这里再将二位数组中的字符向N型转换的时候就很容易知道数组哪些位置不需要存入字符串,那些需要存入了。

到这里整个题就到了最后一步将二位数组中的存入一个字符串。

String answer=new String();
            for(int i=0;i<temp.length;i++)
            {
                for(int j=0;j<temp[0].length;j++)
                {
                    if(temp[i][j]!=' ')
                    answer+=temp[i][j];
                }
            }

然后返回答案就可以了,但是我么也可以考虑两个特殊情况:1.当numRows为1时可以直接返回给到的字符串s。2.字符串的长度小于numRows时可以直接返回给到的字符串s。

下面时整体代码:

class Solution 
{
    public String convert(String s, int numRows) 
    {
        if(numRows==1||s.length()<=numRows)
        {
            return s;
        }
        int group=numRows+numRows-2;//一组所有的字母数
        if(group!=0)
        {
            int groupNumber=s.length()/group;//整组数
            int other=s.length()%group;//剩下不能为一组的字母数
            int line=(numRows-1)*groupNumber;//整组数的列数
            if(other!=0)
            {
                line+=1;
                if(other>numRows)
                {
                    line+=other%numRows;
                }
            }//不为整组数中的列数加入line中
            char [][]temp=new char[numRows][line];//定义数组用于存储字符串
            for(int i=0;i<temp.length;i++)
            {
                for(int j=0;j<temp[0].length;j++)
                {
                    temp[i][j]=' ';
                }
            }
            for(int i=0,k=0;i<s.length();)
            {
                int j=0;
                if(k>=temp[0].length)
                {
                    break;
                }
                for(;j<numRows&&i<s.length()&&k<temp[0].length;j++,i++)
                {
                    temp[j][k]=s.charAt(i);
                }
                j-=2;
                k++;
                for(;j>0&&i<s.length()&&k<temp[0].length;j--,k++,i++)
                {
                    temp[j][k]=s.charAt(i);
                }//每次循环往数组里面存入一组数据
            }//循环存入数组
            String answer=new String();
            for(int i=0;i<temp.length;i++)
            {
                for(int j=0;j<temp[0].length;j++)
                {
                    if(temp[i][j]!=' ')
                    answer+=temp[i][j];
                }
            }
            return answer;
        }
        return null;
    }
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值