本系列将会记录平常一些容易忽略或者重要的概念笔记,和两道OJ编程题解题思路(没有源代码),点击编程题题目则可进入该链接进行答题。博客中一般不出现整个解题代码,主要是思路的记录。部分题目会有一部分解题的模块代码帮助理解。需要参考题目答案源代码,则点击最后一个标题则进入源代码地址,参考源代码。仓库:GitHub地址,
目录
1、概念笔记
-
①printf("%m.ns")
对于这种%m.ns,则是输出m个字符的长度,但是只取字符串n个字符,这m个字符的位置为,这n个字符输出在(m-n ~m),前m-n个字符补充空格。如:
printf("%5.3s\n","computer");
则是
-
②隐式转换
若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型:为double
这就需要考虑隐式转换时的级别。
2、OJ编程
1、组队竞赛
牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
解:因为是第二高水平值,又要最后水平值最大,可以先对这3*n个数进行升序排序。每次我们将最后一个两个数和第一个数组合,这时倒数第二个数就是这个中间数了,继续,将倒数第三个和倒数第四个与第二个组合,这时倒数第四个就是中间值,以此类推,这样就能保证这个有序的数据中,我们每三个数取到的中间数是最大的。如题中所举的例子:
team1:{1,2,5}, team2:{5,5,8}
排序后就是:
1,2,5,5,5,8
我们将倒数第一个数和倒数第二个数与第一个数进行组合
8 5 1
再将倒数第三个数和倒数第四个数与第二个数组合
5 5 2
这样就组合好了,最终取到的最大水平值就是 10。
于是总结规律就是,对于3 * n个数,用数组的下标表示就是[0, 3 * n - 1]。于是每次取到的中间值就是3 * n - 2、3 * n - 2、……一直到n + 1,因为n个队伍,按顺序取前面的数作为最小的数,会取 n 次。
2、删除公共字符
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
解:这道题可借助哈希的思想来解决。将第二个字符串的所有字符存入到一个<char, int>的哈希表中,然后通过遍历第一个字符串,观察第一个字符串的字符出现的次数是否大于0,如果大于0,说明该字符出现在第一个字符串中。
3、 源代码地址
上述两道题的参考代码链接,点击题目就可进入。