本文共 1291 字,大约阅读时间需要 4 分钟。
NI笔试题解
今天参加了一场笔试,遇到了三个有趣的问题。让我来分享一下我的解题思路和代码实现。
第一题是找出字符串第一次出现的字符。这个问题可以通过建立字符出现次数的哈希表来解决。具体步骤是:首先扫描整个字符串,统计每个字符的出现次数;然后再次遍历字符串,找出第一个出现次数为1的字符。
第二题是大数加法。由于之前写过大数乘法函数,所以我误以为这题是乘法。后来仔细阅读题目后,意识到应该实现字符串加法功能。加法的实现思路是:使用两个数组分别存储两个字符串的数字,逐位进行加法运算。当某一位的和大于等于10时,进位处理。
以下是实现代码:
void Add(char s1[], char s2[]) { int num1[M], num2[M]; int i, j; int len1 = strlen(s1); int len2 = strlen(s2); // 读取数字到数组中,num[0]存储最低位 for (i = len1 - 1, j = 0; i >= 0; i--) { num1[j++] = s1[i] - '0'; } for (i = len2 - 1, j = 0; i >= 0; i--) { num2[j++] = s2[i] - '0'; } // 进行加法运算 for (i = 0; i < M; i++) { num1[i] += num2[i]; if (num1[i] > 9) { num1[i] -= 10; if (i + 1 < M) { num1[i + 1]++; } } } // 找到最高有效位 for (i = M; i >= 0 && num1[i] == 0; i--) { if (i > 0) { for (j = 0; j < i; j++) { printf("%d", num1[j]); } printf("%d\n", num1[i]); } else { printf("0\n"); } }} 第三题是一个二维数组中的路径问题。题目要求找出一条路径,使其和最小。这个问题类似于最长公共子序列问题,采用动态规划的方法解决。具体来说,需要构建一个二维数组dp[i][j]表示从起点(i,j)出发到终点(i,j)的最小路径和。通过逐步填充dp数组,找到最小路径。
关于这道题,我觉得可以借鉴最长公共子序列的解法,具体细节需要后续深入思考。
整体来说,这次笔试题目有挑战性,但通过仔细分析和合理设计数据结构,逐一解决了每个问题。希望下次能有更多时间深入思考和练习。
转载地址:http://ucjfk.baihongyu.com/