网站三大标签修改注意事项,怎样自己做公司网站,寓意八方来财的公司名字,微信超市小程序翻译#xff1a; 主要思路解释
整体思路概述#xff1a; 本题的目标是给定整数#xff08;要删除的数字个数#xff09;和整数#xff08;以字符串形式表示的数字#xff09;#xff0c;通过合理删除个数字#xff0c;使得最终得到的新数字最小。程序采用了一种贪心算… 翻译 主要思路解释
整体思路概述 本题的目标是给定整数要删除的数字个数和整数以字符串形式表示的数字通过合理删除个数字使得最终得到的新数字最小。程序采用了一种贪心算法的思想从左到右遍历数字字符串每次尝试删除能使当前数字变小的高位数字经过多次这样的操作以及一些边界情况处理后输出最终得到的最小数字字符串表示的结果。输入与初始化部分 首先定义了多个变量包括用于存储测试用例数量的、每个测试用例中要删除数字个数的、数字字符串长度的以及用于循环计数的和等同时定义了字符数组用于存储输入的数字字符串。通过scanf函数读取测试用例的数量然后进入外层while循环处理每个测试用例。在每个测试用例中先读取要删除的数字个数和数字字符串接着使用strlen函数获取字符串 (n的长度并存储到len 变量中。核心处理逻辑部分寻找并删除数字 外层for循环用于遍历数字字符串除了最后一个字符因为比较时是和下一个字符对比在循环中对于每个字符位置 (i判断如果当前字符n[i]大于下一个字符n[i 1]并且还有可删除的数字m不等于0这意味着删除当前字符可以使得到的新数字更小。此时通过内层for循环将当前字符后面的所有字符依次向前移动一位n[j] n[j 1]实现删除当前字符的效果然后将字符串长度len减1因为删除了一个字符可删除数字个数m也减1。为了确保能重新从字符串开头开始检查是否还有可删除的能使数字变小的字符将i重置为 -1并且如果此时已经删除了足够数量的数字m变为0就直接跳出外层for 循环不再继续寻找可删除的数字了。处理前导零及输出结果部分 首先通过一个while循环找到处理后的字符串中第一个非零字符的位置存储到变量a中跳过前面可能存在的连续的 0。然后通过一个for循环从第一个非零字符位置a开始到len - m结束因为已经删除了m个字符逐个输出剩余字符串的字符这就是最终得到的删除m个数字后的数字字符串表示。最后再判断如果第一个非零字符的位置a大于等于剩余字符串的长度len - m说明剩下的字符串全是 0 或者为空此时输出 0 作为最终结果并且每个测试用例输出完结果后进行换行操作以便下一个测试用例的结果能正确显示持续处理所有测试用例直到全部处理完毕。 #include stdio.h
#include stdlib.h
#include string.hint main()
{int T, m, len, i, j; // T用于存储测试用例的数量m表示每个测试用例中要删除的数字个数len用于记录输入数字字符串的长度i、j主要用于循环计数char n[1002]; // 定义字符数组n用于存储输入的数字字符串大小设为1002可根据题目中数字字符串长度的限制进行合理设置// 读取测试用例的数量Tscanf(%d, T);// 外层while循环针对每个测试用例进行处理每处理完一个测试用例T减1直到所有测试用例都处理完while (T--){// 读取当前测试用例中要删除的数字个数m以及数字字符串nscanf(%d%s, m, n);len strlen(n); // 获取输入数字字符串n的长度// 如果要删除的数字个数m大于等于字符串的长度len说明要删除的数字太多直接输出0并通过continue跳过当前测试用例后续的处理步骤直接进入下一个测试用例的处理if (m len){printf(0\n);continue;}// 外层for循环用于遍历数字字符串除了最后一个字符因为比较时是和下一个字符对比尝试找到可以删除的数字以得到最小的新数字for (i 0; i len - 1; i){// 如果当前字符大于下一个字符且还有可删除的数字m不等于0说明可以通过删除当前字符来使得到的新数字更小if (n[i] n[i 1] m! 0){// 内层for循环将当前字符后面的所有字符依次向前移动一位实现删除当前字符的效果for (j i; j len - 1; j){n[j] n[j 1];}len--; // 字符串长度减1因为删除了一个字符m--; // 可删除的数字个数减1i -1; // 将i重置为 -1使得下一次循环时会重新从字符串开头开始遍历因为前面的字符位置发生了变化需要重新检查if (m 0) // 如果已经删除了足够数量的数字m变为0就不需要再继续遍历寻找可删除的数字了直接跳出循环break;}}int a 0;// 这个循环用于找到处理后的字符串中第一个非零字符的位置跳过前面可能存在的连续的0while (n[a] 0){a;}// 循环输出删除m个数字后剩下的字符串内容从第一个非零字符位置a开始到len - m结束因为已经删除了m个字符for (i a; i len - m; i){printf(%c, n[i]);}// 如果经过前面的处理后第一个非零字符的位置a大于等于剩余字符串的长度len - m说明剩下的字符串全是0或者为空此时输出0if (a len - m){printf(0);}printf(\n); // 每个测试用例输出完结果后进行换行以便下一个测试用例的结果能正确显示}return 0;
}