• LeetCode中等题题分享(5)


    Z字形变换

    题目:

     

    遇到这种题有横有竖的,我首先就想到的二维数组的解法:

    说是Z字形,其实更像是一下一上的重复循环,所以我们思考的是每一个循环需要多少个字符:

    假设rowNum=3,那么中间就是1个,总共需要4个

    假设rowNum=4,那么中间就是2个,总共需要6个

    假设rowNum=5,那么中间就是3个,总共需要8个

    那么很明显,一下一上总共需要的就是2*rowNum-2个。

     

    我们可以把这一次的上下看做一个循环,我们考虑一个循环在二维数组的空间占用

    我们假设这个数组的长度是length:

    int length = s.length();

    numRows个横列:

    int numOfRec = 2*numRows-2;

    竖列的占用我们可以考虑是从numRows递减到0的一个forLoop,总的竖列我们主要考虑循环了多少次就可以了:

    int numCols = (length+numOfRec-1)/numOfRec*(numRows-1);

    然后我们需要做的就是遍历加入二维数组就行了:

    1. //先往下填写numRows个字符,然后自左下到右上填写
    2. public static String convert(String s, int numRows) {
    3. int length = s.length();
    4. if (numRows==1 || numRows>=length){
    5. return s;
    6. }
    7. // 一循环所需要的字符数
    8. int numOfRec = 2*numRows-2;
    9. //列数
    10. int numCols = (length+numOfRec-1)/numOfRec*(numRows-1);
    11. //创建二维数组
    12. char[][] cars = new char[numRows][numCols];
    13. //遍历插入二维数组
    14. for (int i = 0, x = 0, y = 0; i < length ; ++i) {
    15. cars[x][y]=s.charAt(i);
    16. if (i%numOfRec<numRows-1){
    17. ++x;
    18. }else{
    19. --x;
    20. ++y;
    21. }
    22. }
    23. //遍历输出
    24. StringBuilder res = new StringBuilder();
    25. for (int j = 0; j < numRows; j++) {
    26. for (int i = 0; i < numCols; i++) {
    27. char c = cars[j][i];
    28. if (c!='\u0000'){
    29. res.append(c);
    30. }
    31. }
    32. }
    33. return res.toString();
    34. }

            这道题直观上来说就是二维数组+循环的使用问题,解题方法有一些暴力。需要考虑的难点就是二维数组的双重for循环会导致超时,在此程度上应该有所化简。

     结果虽然过了但是不是很满意,以后有机会再优化吧

  • 相关阅读:
    JVM第一话 -- JVM入门详解以及运行时数据区分析
    软件部2022届讲课底稿------完全背包问题
    数据库系统
    论文详读《基于改进 LeNet-5 模型的手写体中文识别》,未完待补充
    设计模式之抽象工厂模式
    图 拓扑排序 leecode 207 Course Schedule
    golang template 使用
    Java并发Map的面试指南:线程安全数据结构的奥秘
    web:[ACTF2020 新生赛]Exec
    【DRAM存储器七】SDRAM介绍-part1
  • 原文地址:https://blog.csdn.net/m0_56289903/article/details/125439221