百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

2023-04-28:将一个给定字符串 s 根据给定的行数 numRows以从上往下

myzbx 2025-06-28 15:25 28 浏览

2023-04-28:将一个给定字符串 s 根据给定的行数 numRows 以从上往下、从左到右进行 Z 字形排列 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下 P A H N A P L S I I G Y I R 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串 "PAHNAPLSIIGYIR" 请你实现这个将字符串进行指定行数变换的函数 string convert(string s, int numRows)。

答案2023-04-28:

算法过程大体可以分为以下步骤:

1.计算给定字符串 s 的长度 n 和指定行数 numRows。

2.如果 numRows 等于 1 或者 numRows 大于等于 n,则返回原始字符串 s。

3.计算一个周期 t,其值为 2 * (numRows - 1)。

4.创建一个字符数组 ans,其长度与输入字符串 s 相同,并用空格符初始化。

5.根据 Z 字形排列的规律,按顺序遍历每一行 i(从第 0 行到第 numRows-1 行)及其对应的列 j(每一列长度为 t)。在遍历的过程中,根据当前所在行的位置 i 和周期 t,计算出对应列的顶部的行号 nextColTop。

6.对于每个字符 s[j],将其填入字符数组 ans 中,并将 fill 指针向后移动一位。如果该字符所在的行不是第 0 行和最后一行,并且在下一个周期中对应的位置 nextColTop-i 小于字符串的长度 n,则将 s[nextColTop-i] 也填入 ans 数组中,并将 fill 指针再次向后移动一位。

7.遍历完所有行和列后,将字符数组 ans 转换为字符串并返回。

时间复杂度:O(n),其中 n 是字符串 s 的长度。我们只需要遍历一次字符串 s。

空间复杂度:O(n),我们需要使用一个字符数组 ans 存储变换后的字符串,数组的大小为输入字符串 s 的长度 n。另外,我们还使用了常数级别的额外空间存储变换时需要的一些变量。

go完整代码如下:

package main

import "fmt"

func convert(s string, row int) string {
    n := len(s)
    if row == 1 || row >= n {
        return s
    }
    t := 2 * (row - 1)
    ans := make([]byte, n)
    fill := 0
    for i := 0; i < row; i++ {
        nextColTop := t
        for j := i; j < n; j += t {
            ans[fill] = s[j]
            fill++
            if i >= 1 && i <= row-2 && nextColTop-i < n {
                ans[fill] = s[nextColTop-i]
                fill++
            }
            nextColTop += t
        }
    }
    return string(ans)
}

func main() {
    s := "PAYPALISHIRING"
    result := convert(s, 3)
    fmt.Println(result)
}

在这里插入图片描述

rust完整代码如下:

fn convert(s: String, row: i32) -> String {
    let n = s.chars().count();
    if row == 1 || row >= n as i32 {
        return s;
    }
    let t = 2 * (row - 1);
    let mut ans: Vec<char> = vec![' '; n];
    let mut fill = 0;
    for i in 0..row {
        let mut next_col_top = t;
        for j in (i as usize..n).step_by(t as usize) {
            ans[fill] = s.chars().nth(j).unwrap();
            fill += 1;
            if i >= 1 && i <= row - 2 && next_col_top - i < n as i32 {
                ans[fill] = s.chars().nth((next_col_top - i) as usize).unwrap();
                fill += 1;
            }
            next_col_top += t;
        }
    }
    ans.iter().collect()
}

fn main() {
    let s = "PAYPALISHIRING".to_string();
    let result = convert(s, 3);
    println!("{}", result);
}

在这里插入图片描述

c++完整代码如下:

#include <iostream>
#include <string>

using namespace std;

string convert(string s, int row) {
    int n = s.length();
    if (row == 1 || row >= n) {
        return s;
    }
    int t = 2 * (row - 1);
    string ans(n, ' ');
    int fill = 0;
    for (int i = 0; i < row; i++) {
        int nextColTop = t;
        for (int j = i; j < n; j += t, nextColTop += t) {
            ans[fill++] = s[j];
            if (i >= 1 && i <= row - 2 && nextColTop - i < n) {
                ans[fill++] = s[nextColTop - i];
            }
        }
    }
    return ans;
}

int main() {
    string s = "PAYPALISHIRING";
    string result = convert(s, 3);
    cout << result << endl; 
    return 0;
}

在这里插入图片描述

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* convert(char* s, int row) {
    int n = strlen(s);
    if (row == 1 || row >= n) {
        return s;
    }
    int t = 2 * (row - 1);
    char* ans = (char*)malloc(sizeof(char) * (n + 1));
    memset(ans, ' ', sizeof(char) * n);
    int fill = 0;
    for (int i = 0; i < row; i++) {
        int nextColTop = t;
        for (int j = i; j < n; j += t, nextColTop += t) {
            ans[fill++] = s[j];
            if (i >= 1 && i <= row - 2 && nextColTop - i < n) {
                ans[fill++] = s[nextColTop - i];
            }
        }
    }
    ans[n] = '\0';
    return ans;
}

int main() {
    char s[] = "PAYPALISHIRING";
    char* result = convert(s, 3);
    printf("%s\n", result); 
    free(result);
    return 0;
}

在这里插入图片描述

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 &quot;小贱贱&quot;韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...