Z型转换

本文介绍了一种将字符串按Z字形排列并重新组合的算法。通过将字符串LEETCODEISHIRING按3行Z字形排列,再逐行读取形成新的字符串LCIRETOESIIGEDHN。文章提供了Java实现代码,展示了如何使用StringBuilder和ArrayList进行操作。

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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);

package com.yyl.one.leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * author:yangyuanliang Date:2019-09-03 Time:19:19
 **/
public class ZConvert {
    public static  String convert(String s, int numRows) {

        if (numRows == 1) return s;

        List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < Math.min(numRows, s.length()); i++)
            rows.add(new StringBuilder());

        int curRow = 0;
        boolean goingDown = false;

        for (char c : s.toCharArray()) {
            rows.get(curRow).append(c);
            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
            curRow += goingDown ? 1 : -1;
        }

        StringBuilder ret = new StringBuilder();
        for (StringBuilder row : rows) ret.append(row);
        return ret.toString();
    }

    public static void main(String[] args) {
        String s="LEETCODEISHIRING";
        int number=3;
        System.out.println(convert(s,number));
    }

}

 

```markdown ### 代码概述 将数据转换为 `0x` (即带 `0x` 前缀的十六进制格式)是为了在代码中表示字节或常量,常见于 C/C++ 数组定义、逆向工程分析和密文提取。 --- ### 代码解析 假设你有一个 32 字节的数据(如字符串、hex 字符串等),需要将其每个字节以 `0x` 开头的形式表示。 #### ✅ 示例:字符串 `"flag{1337}"` 转换为 `0x` 原始字符串: ``` flag{1337} ``` ASCII 转换为十六进制: - `'f'` → $0x66$ - `'l'` → $0x6c$ - `'a'` → $0x61$ - `'g'` → $0x67$ - `'{'` → $0x7b$ - `'1'` → $0x31$ - `'3'` → $0x33$ - `'3'` → $0x33$ - `'7'` → $0x37$ - `'}'` → $0x7d$ 补零至 32 字节后: ```c unsigned char data[32] = { 0x66, 0x6c, 0x61, 0x67, 0x7b, 0x31, 0x33, 0x33, 0x37, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; ``` 这就是标准的 `0x` 表示法。 --- #### 🔧 手动转换方法(字符 → 0x) | 字符 | ASCII 十六进制 | 0x 表示 | |------|----------------|---------| | `'A'` | 41 | `0x41` | | `'z'` | 7a | `0x7a` | | `'0'` | 30 | `0x30` | 使用在线工具或 Python 快速生成: ##### 🐍 Python 脚本自动转换 ```python text = "flag{1337_you_found_it!}" # 转为 bytes,不足32则补 \x00 data = text.encode('utf-8').ljust(32, b'\x00')[:32] # 输出 0x 格式 print(', '.join(f'0x{b:02x}' for b in data)) ``` 输出结果: ``` 0x66, 0x6c, 0x61, 0x67, 0x7b, 0x31, 0x33, 0x33, 0x37, 0x5f, 0x79, 0x6f, 0x75, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x74, 0x21, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ``` --- #### 💡 注意事项 - 每个字节必须是两位十六进制数,不足前面补 0,如 $0x0a$ 不可写成 $0xa$; - 在 C 中,`0x` 是十六进制前缀,编译器据此识别进制; - 若是从内存或 dump 文件读取,可用 `xxd` 或 `hexdump` 提取原始 hex 再加 `0x` 前缀。 --- ### 知识点(列出该代码中遇到的知识点) 1. **十六进制前缀 `0x`**:C/C++ 中表示整数为十六进制,如 $0xff = 255$。 2. **ASCII 编码映射**:字符与字节值一一对应,可查表或用函数转换。 3. **字节填充对齐**:不足 32 字节时补 $0x00$,确保长度一致。 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值