酒煮青梅392 2024-01-16 18:56 采纳率: 65.2%
浏览 4
已结题

java来解决字符串的”Z"字型变换(相关搜索:字符串|输入字符串)

本题为力扣的一题:
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
示例 3:

输入:s = "A", numRows = 1
输出:"A"

提示:

1 <= s.length <= 1000
s 由英文字母(小写和大写)、',' 和 '.' 组成
1 <= numRows <= 1000


class Solution {
    public String convert(String s, int numRows) {
        int k = 0;//记录s的字符
        int n = s.length();
        int flag = (n%numRows+1==0)?0:1;//如果不可以整除,有余数要加一列
        int high = (n/numRows+1)+flag;//列数
        int sp = numRows-2;//特殊列,即"Z"中间的斜杠列,每列只有一个字符
        int numRowstemp = numRows-1;//用于特殊列的索引

        char temp[][] = new char[numRows][high];//用二维数组按照先列后行来给二维数组赋值

        for(int j = 0;j < high;j++)
        {
            for(int i = 0;i < numRows;i++)
            {
                if((j%(numRows-1)==0||j==0)&&j!=high)//即"Z"列的有numRows个的列,如numRows==3,第1,3,6列
                {
                    temp[i][j] = s.charAt(k);
                    k++;
                    numRowstemp = numRows;//重置numRowstemp
                }
                else
                {
                        temp[numRowstemp][j] = s.charAt(k);//特殊列赋值
                        k++;
                        numRowstemp--;
                }
            }
        }

        char[] s1 = new char[n];//用来存储输出的字符串
        int k1 = 0;
        for(int i = 0;i < numRows;i++)
        {
            for(int j = 0;j < high;j++)
            {
                s1[k1] = temp[i][j];
                k1++;
            }
        }

        
    
            String s2 = new String(s1);

            return s2;
    }

    
}

img


不知道哪里的错误

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-16 20:22
    关注

    【以下回答由 GPT 生成】

    此代码是用Java实现的字符串的Z字形变换。下面是详细的解决方案和代码解释:

    1. 首先,初始化变量k为0,用于记录字符串s的字符位置。
    2. 然后,计算变量n为字符串s的长度。
    3. 接着,判断当n除以numRows取余的结果加1等于0时,将flag赋值为0,否则赋值为1。这是为了判断是否有余数,如果有余数需要再增加一列。
    4. 然后,计算变量high为n除以numRows加1,再加上flag的结果。这是Z字形变换后的字符排列行数。
    5. 接下来,初始化变量sp为numRows减2,表示特殊列,即Z字形中间的斜杠列,每列只有一个字符。
    6. 同时,初始化变量numRowstemp为numRows减1,用于特殊列的索引。
    7. 创建一个二维字符数组temp,大小为numRows行,high列。该数组用于按照先列后行的顺序存储字符。
    8. 使用嵌套的for循环,外层循环控制列的遍历,内层循环控制行的遍历。
    9. 在每一次内层循环中,首先判断当前列是否是特殊列,即Z字形中的numRows个列。如果是,将当前字符赋值给temp数组对应位置,并将k值加1,numRowstemp值减1。
    10. 如果numRowstemp等于0,表示已经遍历完numRows个列,就退出内层循环。
    11. 接着,判断当前列是否是斜杠列。如果是,将当前字符赋值给temp数组对应位置,并将k值加1,sp值减1。
    12. 内层循环结束后,重置numRowstemp的值为numRows减1,sp的值为numRows减2。
    13. 使用StringBuilder类创建一个字符串变量sb,用于存储最终的结果。
    14. 使用嵌套的for循环,外层循环控制行的遍历,内层循环控制列的遍历。
    15. 在每一次内层循环中,如果temp数组对应位置的值不为空字符,则将其追加到sb中。
    16. 最后,返回sb转换为字符串的结果。

    这是该问题的具体解决方案和代码实现。希望对你有帮助。如果还有其他问题,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月25日
  • 创建了问题 1月16日

悬赏问题

  • ¥20 求下下面这个数据结构代码
  • ¥15 路由器考试怎么办,有懂行的吗 ,eNSP
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice
  • ¥15 谁会做这个啊#ensp#Boson NetSim
  • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
  • ¥15 设计简单目录管理系统,要满足以下内容