当前位置: 首页 > 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 字形变换的规律来做的,就是上面优化的算法

相关文章:

  • 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说明文档
  • 网站建设视觉效果/百度关键词屏蔽
  • 厚街网站建设公司/百度网站大全
  • 做网站赚50万/北京百度推广客服电话多少
  • 怀化市建设局门户网站/西安seo霸屏
  • 网站建设有免费的空间吗/百度开户要多少钱
  • 时时彩网站代理怎么做?/手机seo排名