题解 | #牛牛的旗语传递#

牛牛的旗语传递

https://www.nowcoder.com/practice/810b1c80a9c341c4af69facac350d6bc

考察知识点:字符串处理,数组的遍历与操作

题目解析

输入:"TWIPARSEHC_NK",3

意思为加密后的字符:"TWIPARSEHC_NK",有3个单词

是由如下的形式组合成的

0 | 1 | 2 | 3 | 4 | 5 | 6

T | | A | | H | | K

W | P | R | E | C | N |

I | | S | | _ |

按照Z字形型的读法就是 TWI P ARS E HC_ N K

详细的思路解析在代码注释里了解

采用的编程语言:C

完整的编程代码:如图所示

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @param numRows int整型 
 * @return string字符串
 */
char* decodeFlag(char* s, int numRows ) {
    char *word_number[1000] = {0};
    char decode_s[1000] = {0};
    int s_len = 0;
    int word_index[1000] = {0};
    int index = 0, count = 0, k = 0;

    if (s == NULL)
        return NULL;

  	/* 获取字符串s的长度*/
    s_len = strlen(s);
  	/* 为每个单词分配一片内存用于存储单词数组 */
    for (int i = 0; i < numRows; i++)
        word_number[i] = (char *)malloc(1000 * sizeof(char));

    while (1) {
	  	/* 加解密的算法流程如下解析 */
        if (k % 2 == 0) {
            for (int j = 0; j < numRows; j++) {
                index = word_index[j];
                word_number[j][index] = s[count++];
                word_index[j]++;
            }
        } else {
            for (int j = (numRows-2); j > 0; j--) {
                index = word_index[j];
                word_number[j][index] = s[count++];
                word_index[j]++;
            }
        }

        if (count >= s_len)
            break;
        k++;
    }

  	/* 将所有单词拼接成新的字符串 */
    for (int i = 0; i < numRows; i++)
        strcat(decode_s, word_number[i]);

  	/* 释放已分配的内存 */
    for (int i = 0; i < numRows; i++) {
        if (word_number[i]) {
            free(word_number[i]);
            word_number[i] = NULL;
        }
    }

  	/* 将字符串拷贝给s,因为函数内部的局部变量在函数退出后就被释放了 */
    strncpy(s, decode_s, s_len);

    return s;
}

面试高频TOP202解析 文章被收录于专栏

采用Java,C,Python等方法去解答面试高频TOP202题目,

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务