当前位置: 首页 > article >正文

力扣6 N字形变换

描述

力扣6 N字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 N字形排列。

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

P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
1 <= s.length <= 1000
s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
1 <= numRows <= 1000

方法:模拟二维数组

思路:
模拟二维数组,重要的是要找到循环。n字形的循环从一整列开始,到下一整列起点前结束,易知一个循环的元素个数为numRows * 2 - 2。并且一个循环的列数为numRows - 1。知道了一个循环的元素个数和列数,就可以求得总列数,可以构造出二维数组。
放元素:当在整列时,下一个元素是上一个元素的行数加1,当处于斜线时,下一个元素是上一个元素的行数减1,列数加1.并且每个循环的元素是确定的,每个整列的元素也是确定的,所以巧妙利用%运算确定下一个元素坐标变化情况
具体实现及注释:

class Solution {
   public String convert(String s, int numRows) {
       char[] chars = s.toCharArray(); 
       int length = s.length();
       //当只有一行的时候,直接返回s,不然后面cycleNum计算值为0会出现除0;
       if (numRows == 1) return s;
       //一个循环所包含的元素
       int cycleNum = 2 * numRows - 2;
       //所需列数
       int colNum = (length / cycleNum + 1) * (numRows - 1);
       //模拟的二维数组
       char[][] binaryArray = new char[numRows][colNum];
       //坐标
       int x = 0;
       int y = 0;
       for (int i = 1; i <= length; i++) {
           binaryArray[x][y] = chars[i-1];
           //这里mod即为当前元素在一个循环中的位置信息。当其位置小于行数时,说明其下一个元素在整列上,反之则在斜线上。 
           int mod = i % cycleNum;
           //注意这里需要考虑mod == 0 的特殊情况,当mod == 0时,代表下一个元素是循环中的最后一个元素,他应该属于mod >= numRows的情况。
           if (mod < numRows && mod != 0) x++;
           else {
               x--;
               y++;
           }
       }
       StringBuffer sb = new StringBuffer();
       for (int i = 0; i < numRows; i++) {
           for (int j = 0; j < colNum; j++) {
               char c = binaryArray[i][j];
               if (c != 0) sb.append(c);
           }
       }
       return sb.toString();
   } 
}


http://www.kler.cn/news/317739.html

相关文章:

  • Python 方法传参详解
  • 【裸机装机系列】11.kali(ubuntu)-优化-扩展root分区存储空间
  • 快递预约取件API接口代码
  • 手机上轻松解压并处理 JSON 文件
  • [单master节点k8s部署]22.构建EFK日志收集平台(一)
  • 网站服务器怎么计算同时在线人数?
  • python基础(1)pyenv安装和对Django使用
  • Python编码系列—Python外观模式:简化复杂系统的快捷方式
  • pytorch--流水线并行
  • pandas外文文档快速入门
  • UNet 眼底血管分割实战教程
  • Python Flask网页开发基本框架
  • 大数据新视界 --大数据大厂之 Vue.js 与大数据可视化:打造惊艳的数据界面
  • 【Java面向对象高级06】static的应用知识:代码块
  • java开发jmeter采样器
  • 【AI写作】介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用
  • 目标检测任务中xml标签文件修改
  • 【学习笔记】Transformer架构探讨
  • [ IDE ] SEGGER Embedded Studio for RISC-V
  • C++初阶学习——探索STL奥秘——反向迭代器
  • [Leetcode 543][Easy]-二叉树的直径-递归
  • ubuntu安装StarQuant
  • 【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL22
  • 【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系
  • 高级java每日一道面试题-2024年9月20日-分布式篇-什么是CAP理论?
  • 【Java】Java开发全攻略:从环境搭建到高效编程
  • vulnhub-prime1
  • Android 检测图片抓拍, 聚焦图片后自动完成拍照,未对准图片的提示请将摄像头对准要拍照的图片
  • 红书 API 接口:笔记详情数据接口的接入与使用
  • IDEA 关闭自动补全功能(最新版本)