leetcode刷题:The string "PAYPALISHIRING"

本文介绍了一种将字符串以Z形方式打印的算法,并提供了两种实现方案。一种使用二维数组模拟转换过程,另一种则直接模拟字符的存储位置,后者代码更简洁易懂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P…….A……..H…….N
..A..P….L..S….I…I….G
….Y………I……..R
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.

Therefore, s = ABCD, row = 2, can be arranged as:
A….C
…B….D

由于原题对于题目描述不太清楚,我照着disscuss里面加了一个例子描述,方便阅读。

首先是我自己的代码:
/****************************************/
string s = “ABC”;
int numRows = 2 ;
if (s.size() == 1)
{
cout << s.size();
return 0;
}
string str;
int num2 = numRows / 2;
char ch[1000][1000];
int row = 0;
int i = 0;
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
ch[i][j] = ’ ‘;
}
}
while (i < s.size())
{

    for (int j = 0; j < numRows; j++, row++) {
        ch[j][row] = s[i];
        i++;
    }
}
i = 0;
while (i<s.size())
{
    for (int k = 0; k<numRows; k++) {
        int j = 0;
        int temp = 0;
        while(temp < 2) {
            if (ch[k][j] == ' ' || ch[k][j] == '\0')
            {
                j++;
                temp++;
                continue;
            }   
            else
            {
                temp = 0;
                str += ch[k][j];
                i++;
                j++;
            }
        }
    }
}
return str;
/*****************************************/
写的很烂,思路很简单,就是用一个二维数组模拟一遍题目的转换过程,先竖着存入,然后横着读出,但是应该是由于我的二维数组范围的问题,导致不通过。然后我看了下disscuss里面大神的算法。
/******************************************************/
string s = "ABC";
int nRows = 2 ;
for (int i = 0; i < len; ++i)
{
    str[row].push_back(s[i]);

    if (row == 0)
        step = 1;
    else if (row == nRows - 1)
        step = -1;

    row += step;
}

s.clear();
for (int j = 0; j < nRows; ++j)
{
    s.append(str[j]);
}
/*****************************************************/
代码简洁,思路简单,同样是模拟一个转换的过程,先从第一行开始存,然后行数++,存到最后一行的时候又开始返回往上开始存,行数--,知道s的字符串存完,整个存储过程类似于一个“W”的形状。

菜鸡继续加油。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值