每日刷题记录(十)

目录

  • 第一题:组队竞赛
    • 解题思路:
    • 代码实现:
  • 第二题:删除公共字符
    • 解题思路:
    • 代码实现:
  • 第三题:排序子序列
    • 解题思路:
    • 代码实现:
  • 第四题:倒置字符串
    • 解题思路:
    • 代码实现:
  • 第五题:字符串中找出连续最长的数字串
    • 解题思路:
    • 代码实现:

第一题:组队竞赛

牛牛举办了一次编程比赛,参加比赛的有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),表示每个参赛选手的水平值.

输出描述:

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

示例1

输入 2 5 2 8 5 1 5
输出 10

解题思路:

  1. 用数组接收所有水平值,用Arrays.sort方法对数组进行排序
  2. 选择水平值时使用贪心算法,选择当前情况下最大的水平值

代码实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) { 
           int n  = in.nextInt();
           int[] nums = new int[3*n];
           for(int i = 0;i < (3*n);i++) {
            nums[i] = in.nextInt();
           }
           Arrays.sort(nums);
           long sum = 0;
           for(int i = 0;i < n;i++) {
            sum += nums[nums.length-(2*(i+1))]; 
           }
           System.out.println(sum);
        }
    }
}

第二题:删除公共字符

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

输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串

示例1

输入: They are students. aeiou
输出: Thy r stdnts.

解题思路:

  1. 用HashSet接收第二个字符串
  2. 遍历第一个字符串,如果set中不包含该字符,则拼接到ret上

代码实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { 
            String a = in.nextLine();
            String b = in.nextLine();
            HashSet<Character> set = new HashSet<>();
            for(char ch : b.toCharArray()) {
                set.add(ch);
            }
            String ret = ""; 
            for(int i = 0; i < a.length();i++) {
                if(!set.contains(a.charAt(i))) {
                    ret +=a.charAt(i);
                } 
            }
            System.out.println(ret); 
        }
    }
}

第三题:排序子序列

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。

输出描述:
输出一个整数表示牛牛可以将A最少划分为多少段排序子序列

示例1

输入
6
1 2 3 2 2 1
输出
2

解题思路:

  1. 遍历数组,由于要比较array[i]和array[i+1],所以定义数组时将数组大小设为n+1
  2. 若array[i] > array[i+1],则进入非递增序列判断,直到遍历到下一个值不大于等于为止,count++,然后进行下一位置的判断
  3. 若a[i+1]
  4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减序列。

代码实现:

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int[] array = new int[n + 1];
            for (int i = 0; i < n; i++) {
                array[i] = in.nextInt();
            }
            int count = 0;
            int i = 0;
            while (i < n) {
                if (array[i] > array[i + 1]) {
                    while (i < n && array[i] > array[i + 1]) {
                        i++;
                    }
                    count++;
                    i++;
                } else if (array[i] == array[i + 1]) {
                    i++;
                } else {
                    while (i < n && array[i] < array[i + 1]) {
                        i++;
                    }
                    count++;
                    i++;
                }
            }
            System.out.println(count);
        }
    }
}

第四题:倒置字符串

描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割

示例1

输入: I like beijing.
输出: beijing. like I

解题思路:

  1. 构造逆置字符串函数reverse,先逆置整个字符串
  2. 遍历字符串,将每个单词逆置

代码实现:

public class Main {
    public static void reverse(char[] ch, int start, int end) {
        for (int i = 0; i < ch.length; i++) {
            if (start < end) {
                char tmp = ch[start];
                ch[start] = ch[end];
                ch[end] = tmp;
                start++;
                end--;
            }
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String s = in.nextLine();
            char[] ch = s.toCharArray();
            int len = ch.length;
            reverse(ch, 0, len - 1);
            int i = 0;
            while (i < len) {
                int j = i;
                while (j < len && ch[j] !=' ') {
                    j++;
                }
                if(j < len) {
                    reverse(ch,i,j-1);
                    i = j+1;
                }else {
                    reverse(ch,i,j-1);
                    i = j;
                }
            }
            String ret = new String(ch);
            System.out.println(ret);
        }
    }
}

第五题:字符串中找出连续最长的数字串

描述
读入一个字符串str,输出字符串str中的连续最长的数字串

输入描述
个测试输入包含1个测试用例,一个字符串str,长度不超过255。

输出描述:
在一行内输出str中里连续最长的数字串。

示例1

输入: abcd12345ed125ss123456789
输出: 123456789

解题思路:

  1. 遍历字符串,用cur记录当前最长的数字串
  2. 如果遇到不是数字字符,则表示一个连续的数字串结束了,则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到ret
  3. 最后单独判断一下cur记录的最后一个数字串为字符串末尾的情况

代码实现:

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String s = in.nextLine();
            String ret = "";
            String cur = "";
            int i = 0;
            for (; i < s.length(); i++) {
                char ch = s.charAt(i);
                if (ch >= '0' && ch <= '9') {
                    cur += ch;
                } else {
                    if (ret.length() < cur.length()) {
                        ret = cur;
                    }
                    cur = "";
                }
            }
            if(i == s.length() && ret.length() < cur.length()) {
                ret = cur;
            }
            System.out.println(ret);
        }
    }
}

你可能感兴趣的:(在线OJ,算法,java,数据结构)