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

leetcode刷题日记—— Z 字形变换

[ 题目描述 ]:
在这里插入图片描述

[ 思路 ]:

  • 题目要求将一个字符串按照给定的行数进行 z 字形排列,然后读取每一行组成的新的字符串
  • 最简单的想法就是遍历字符串,对每个字符从 0 - numRows - 0,这样的顺序去存储每个字符所在的行,然后遍历每一行放入答案数组
  • 运行如下

在这里插入图片描述

char* convert(char* s, int numRows) {
    int len=strlen(s);
    if(len==1 || numRows==1) return s;
    bool is_reverse=false;
    int* char_index=(int*)malloc(sizeof(int)*(len));
    char* ans=(char*)malloc(sizeof(char)*(len+1));
    ans[len]='\0';
    int index=0;
    for(int i=0;i<len;i++){
        if(is_reverse){
            char_index[i]=index--;
        }else{
            char_index[i]=index++;
        }
        if(index==numRows-1 || index==0){
            is_reverse=!is_reverse;
        }
    }
    int row=0,ans_index=0;
    while(row<numRows){
        for(int i=0;i<len;i++){
            if(char_index[i]==row){
                ans[ans_index++]=s[i];
            }
        }
        row++;
    }
    free(char_index);
    return ans;
}

[ 优化 ]:

  • 上面的解法使用了很多的额外空间,并且这题的重新排列的顺序是由规律的,那是否可以根据这一规律,对每行元素的位置进行确定
  • 由题意可以发现,一个完整Z字形周期为 2 * numRows - 2,因为第一行和最后一行在一个完整的 z 字周期中,仅只有一个元素,其他行均为二
  • 按行处理字符串, 对于每一行 i,从该行的起始位置开始
    • 垂直向下的字符位于 j + i
    • 斜向上的字符位于 j + cycleLen - i(首行和末行除外)
  • 运行如下
    在这里插入图片描述
char* convert(char* s, int numRows) {
    if (numRows==1) return s;
    int len=strlen(s);
    char* ans=(char*)malloc(len + 1);
    ans[len] = '\0';
    int index=0;
    int cycleLen=2 * numRows - 2;
    for (int i = 0; i < numRows; i++) {
        for (int j = 0; j + i < len; j += cycleLen) {
            ans[index++] = s[j + i];
            if (i != 0 && i != numRows - 1 && j + cycleLen - i < len) {
                ans[index++] = s[j + cycleLen - i];
            }
        }
    }
    return ans;
}

[ 官方题解 ]:

  • 一、利用二维矩阵模拟,就是创建一个矩阵,然后将字符按照 z 字形,存放在这个二维矩阵中,再遍历这个二维矩阵的每一行,得出答案。其实和第一种解法一样,只是我存储的是每个字符的所在的行数
  • 二、压缩矩阵空间,在方法一的基础上,削减了没有用上的空间。主要通过为每一行去初始化一个空列表,然后遍历字符串,将每个字符插入对应行的列表的末尾
  • 三、直接构造,通过 Z 字形变换的规律来做的,就是上面优化的算法

文章转载自:

http://PVlvqkmo.nggry.cn
http://9BBPTVJQ.nggry.cn
http://GW7Do6Xp.nggry.cn
http://vu10Iv33.nggry.cn
http://tuvcGr2C.nggry.cn
http://hOSG0bTV.nggry.cn
http://ZtY9O7eE.nggry.cn
http://yLLgPqOR.nggry.cn
http://biryngDj.nggry.cn
http://rpeRdYUs.nggry.cn
http://OMVEFihR.nggry.cn
http://sUVKERfC.nggry.cn
http://A4xCLnkJ.nggry.cn
http://EoFnGDP6.nggry.cn
http://AdAhZ9sF.nggry.cn
http://tBcUK7M6.nggry.cn
http://4T1ISr2E.nggry.cn
http://35WNj8qC.nggry.cn
http://Q56xwRmB.nggry.cn
http://BS91Hrh5.nggry.cn
http://ronFbCRm.nggry.cn
http://JkiV1bHj.nggry.cn
http://6ScZnz09.nggry.cn
http://02FOuFOQ.nggry.cn
http://JNPRDiVT.nggry.cn
http://pDFhR7F0.nggry.cn
http://KlmZGEDS.nggry.cn
http://HouxOpoM.nggry.cn
http://bmTRtg6k.nggry.cn
http://zrbdpUce.nggry.cn
http://www.dtcms.com/a/116293.html

相关文章:

  • BGP路由协议之属性2
  • RabbitMQ运维
  • 面试常被问道OSPF的问题
  • 针对Qwen-Agent框架的源码阅读与解析:FnCallAgent与ReActChat篇
  • uniapp小程序登录失效后操作失灵问题
  • 电脑有时出现检测不到音箱设备怎么办?
  • redis学习笔记
  • JS 事件委托
  • 数据结构值ST表的详细讲解浅显易懂
  • WPF插入背景图
  • 代码随想录+leetcode学习笔记
  • 负载均衡是什么,Kubernetes如何自动实现负载均衡
  • Dubbo(35)如何优化Dubbo的网络通信?
  • leetcode376-摆动序列
  • 【Spring Cloud Netflix】GateWay服务网关
  • CISCO路由器配置DHCP及中继
  • Android学习总结之service篇
  • Linux file命令
  • Linux Terminal Mode | canonical / nocanonical / cbreak / raw
  • 【35期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股当天分价成交占比数据及接口API说明文档
  • 结构化需求分析:专业方法论与实践
  • 简单线程池实现
  • PDF转安卓APP软件, 支持加密添加一机一码, 静态密码, 保护APK版权使用说明和CSDN文库下载
  • [C++面试] explicit关键字面试点总结
  • 安装nfs客户端(centos)
  • Go语言-初学者日记(二):数组、切片与 map,一篇彻底弄懂集合类型!
  • 体育风暴篮球足球体育球员综合资讯网站模板
  • Python多线程编程​​ 和 ​​JVM调优
  • C语言查漏补缺:占位符篇
  • JavaScript中的Proxy详解