zoukankan      html  css  js  c++  java
  • leetcode刷题六<z字形变换>

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
    
    比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
    
    L   C   I   R
    E T O E S I I G
    E   D   H   N
    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
    
    请你实现这个将字符串进行指定行数变换的函数:
    
    string convert(string s, int numRows);
    示例 1:
    
    输入: s = "LEETCODEISHIRING", numRows = 3
    输出: "LCIRETOESIIGEDHN"
    示例 2:
    
    输入: s = "LEETCODEISHIRING", numRows = 4
    输出: "LDREOEIIECIHNTSG"
    解释:
    
    L     D     R

    开始没有思路,看完官方的思路和代码然后这样做的

    char* convert(char* s, int numRows) {
        if (numRows == 1||numRows==0)
            return s;
        int n=strlen(s);
        if(n==0||n==1||n==2) return s;
        char *re = (char *)malloc((n + 1) * sizeof(char));
        int j, k = 0;
        for (int i = 0; i < numRows; i++) {
            j = i;
            while (j < n) {
                re[k++] = s[j];
                if (i != 0 && i != numRows - 1 && j + 2 * (numRows - 1 - i) < n)
                    re[k++] = s[j + 2 * (numRows - 1 - i)];
                j += 2 * numRows - 2;
            }
        }
        re[n] = '';
        return re;
    }

    但是这样算法的复杂度有点高,大概是0(numRows+n)吧,后来看了下评论,发现一个比较优化的解法

    ,也是逐行处理,但是算法的复杂度貌似缩小到了0(n),大概思路是先遍历0行,然后是i行,然后是剩下的

    代码如下:

    char* convert(char* s, int numRows) {
        //获取s长度
        if(numRows==1)return s;
        int len=strlen(s); 
        if(len==1||len==2) return s;
        //定义循环变量
        char* ret=(char *)malloc(sizeof(char)*(len+1));
        int i,j=0,k=0;
        //判断不形成z字
        //定义指针变量
        for(i=0;i<len;i=k*(2*numRows-2))
        {
            ret[j++]=s[i];
            k++;
        }
        //判断满足那个条件
        for(i=1;i<len-1;i++)
        {
            k=0;
            while(k*(2*numRows-2)+i<len)
            {
                //按照索引添加
                ret[j++]=s[k*(numRows-2)+i];
                if((k+1)*(2*numRows-2)-i<len) ret[j++]=s[(k+1)*(2*numRows-2)-i];
             k++;
            }
            
        }
        k=0;
        for(i=numRows-1;i<len;i=k*(2*numRows-2)+numRows-1)
        {
            ret[j++]=s[i];
            k++;
        }
        ret[j]='';
        return ret;
    }
  • 相关阅读:
    普元EOS中nui(对jquery MiniUi的封装)合并表头
    css--让箭头动起来
    在开发中说一说你最讨厌什么函数????
    前端开发学习路线
    默哀日,网页置灰,开发人员你应该掌握的
    window--环境下升级node的版本(因为低版本node运行Vue项目有问题)
    小程序--模板<template>的定义和使用
    小程序--app.js之App方法
    小程序---页面配置文件,只对自己的页面有效果
    javascript 内存模型
  • 原文地址:https://www.cnblogs.com/kk328/p/10468261.html
Copyright © 2011-2022 走看看