【算法刷题日记之本手篇】组队竞赛与删除公共字符

举报
未见花闻 发表于 2022/07/31 22:13:05 2022/07/31
【摘要】 本篇文章介绍来自牛客试题广场的两道题题解,分别为【组队竞赛】和【删除公共字符】,展示语言java。

⭐️前面的话⭐️

本篇文章介绍来自牛客试题广场的两道题题解,分别为【组队竞赛】和【删除公共字符】,展示语言java。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆首发时间:🌴2022年7月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《数据结构与算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

⭐️组队竞赛⭐️

🔐题目详情

牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.

输入描述:

输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.

输出描述:

输出一个整数表示所有队伍的水平值总和最大值.

示例:

输入

2
5 2 8 5 1 5

输出

10

链接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b
来源:牛客网

💡解题思路

本题为ACM模式解题模式,需要自己写输入输出的代码,也就是先得使用Scanner类获取数据,再通过println输出答案。

基本思路:排序+筛选

根据题目要求,我们需要对这些选手进行分组,每组3人,每组的平均水平值为每组3个人水平值居中的那一个水平值,要想使平均水平值总和最高,我们要使每个队伍的最低水平值和最高水平值都尽可能地低,也就是说,假设有n组,排序前n个元素作为每组的最低水平值,我们还需要使每组的最高水平值也是最低,所以从第n+1个元素开始,每连续两个元素作为一组的中间水平值与最高水平值,这样就能保证所有组的最大值水平和最小,平均水平值之和最大。

第一步,我们对数组进行排序,就拿示例5 2 8 5 1 5来说,输入了两个队伍的水平值,一共6个数据,排序后得到1 2 5 5 5 8

第二步,我们示例的数据是两组,因此排序后数组前两个元素为每组的最小水平值,然后第三个与第四个元素分别为其中一组的中间水平值与最大水平值,同理第五个与第六个元素为另外一组的中间水平值与最大水平值,因此两组的最大瓶颈水平值之和为5+5=10
题解
小心,求和的时候要注意会不会溢出,这题是存在溢出可能性,因此求和要使用long类型的变量接收。

🔑源代码

参考语言Java:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[3 * n];
        for (int i = 0; i < 3 * n; i++) {
            arr[i] = sc.nextInt();
        }
        //1.排序
        Arrays.sort(arr);
        //2.筛选
        long ans = 0;
        for (int i = n; i < 3 * n; i += 2) {
            //后面两数前者为中间值,作为每组的平均水平值
            ans += arr[i];
        }
        System.out.println(ans);
    }
}

⭐️删除公共字符⭐️

🔐题目详情

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

输入描述:

每个测试输入包含2个字符串

输出描述:

输出删除后的字符串

示例

输入

They are students. 
aeiou

输出

Thy r stdnts.

链接:https://www.nowcoder.com/questionTerminal/f0db4c36573d459cae44ac90b90c6212
来源:牛客网

💡解题思路

本题为ACM类型的编程题,需要自己输入输出。

基本思路:简单模拟题
遍历第一个字符串,判断每个字符是否在第二个字符串存在,如果存在则删除,或者使用StringBuilder对象构造,此时应忽略在第二个字符串存在的字符。
题解图

🔑源代码

参考语言:Java

import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        
        StringBuilder ans = new StringBuilder();
        int n = str1.length();
        for (int i = 0; i < n; i++) {
            String cur = str1.charAt(i) + "";
            if (!str2.contains(cur)) {
                ans.append(cur);
            }
        }
        System.out.println(ans.toString());
    }
}

🌱总结

组队竞赛:排序+筛选
根据题目要求,我们需要对这些选手进行分组,每组3人,每组的平均水平值为每组3个人水平值居中的那一个水平值,要想使平均水平值总和最高,我们要使每个队伍的最低水平值和最高水平值都尽可能地低,也就是说,假设有n组,排序前n个元素作为每组的最低水平值,我们还需要使每组的最高水平值也是最低,所以从第n+1个元素开始,每连续两个元素作为一组的中间水平值与最高水平值,这样就能保证所有组的最大值水平和最小,平均水平值之和最大。
删除公共字符:简单模拟题
遍历第一个字符串,判断每个字符是否在第二个字符串存在,如果存在则删除,或者使用StringBuilder对象构造,此时应忽略在第二个字符串存在的字符。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。