找落单筷子的长度(数组,排序,java算法)

简介: 找落单筷子的长度(数组,排序,java算法)

找落单筷子的长度(数组,排序,java算法)


题目描述

经过一段时间的紧张筹备,电脑小组的“RP 餐厅”终于开业了,这天,经理 LXC 接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题:筷子!

CX 小朋友找出了餐厅中所有的筷子,但遗憾的是这些筷子长短不一,而我们都知道筷子需要长度一样的才能组成一双,更麻烦的是 CX 找出来的这些筷子数量为奇数,但是巧合的是,这些筷子中只有一只筷子是落单的,其余都成双,善良的你,可以帮 CX 找出这只落单的筷子的长度吗?

输入格式

第一行是一个整数,表示筷子的数量 n。

第二行有 n 个整数,第 ii 个整数表示第 ii 根筷子的长度 a_ia

i 。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入

9

2 2 1 3 3 3 2 3 1

输出

2

提示

请注意数据读入对程序效率造成的影响。

请注意本题的空间限制为 44 Mb。

现在开始上代码

package cn.itcast.algorithm.TTT_64;
import java.util.Arrays;
import java.util.Scanner;
public class Main71 {
    public static void main(String[] args) {
        //这两组为测试用例
//       int n = 7;
//       int[] nteam = {2, 2 ,1 ,3 ,3 ,3 ,1};     
//        int n = 9;
//        int[] nteam = {2, 2 ,1 ,2 ,3 ,3 ,3 ,3 ,1};
        Scanner sc = new Scanner(System.in); //开始输入有多少根筷子和每根筷子的长度
        int n = sc.nextInt();
        int[] nteam = new int[n];
        for (int j = 0;j < n;++j){
            nteam[j] = sc.nextInt();
        }
       int chang = zhaoKuaizi(n,nteam);//找出落单的筷子
       System.out.println("落单筷子的长度为:" + chang);
    }
    /**
     *找单个是利用数组排序好之后的落单不成对
     */
    private static int zhaoKuaizi(int n, int[] nteam) {
        int l = nteam.length;
        paixu(nteam);
        int m = 0;
        int i = 0;
        while(i < l){
            if(i == l-1){
                m = l-1;
                break;
            }
            if (nteam[i] == nteam[i+1]){
                i += 2;
            }else{
                m = i;
                break;
            }
        }
        return nteam[m];
    }
    /**
     * 对数组进行由大到小的排序
     *          如果怕麻烦可以用封装好的Arrays.sort();对数组进行排序
     */
    private static int[] paixu(int[] nums) {
        int max = Arrays.stream(nums).max().getAsInt();
        int min = Arrays.stream(nums).min().getAsInt();
        int[] arr = new int[max - min + 1];
        for (int num : nums) {
            arr[num - min]++;
        }
        int index = 0;
        for (int i = 0; i < nums.length; ) {
            if (arr[index] == 0) {
                index++;
                continue;
            }
            for (int j = 0; j < arr[index]; j++) {
                nums[i++] = index + min;
            }
            index++;
        }
        return nums;
    }
}
相关文章
|
5天前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
5天前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
3天前
|
Java API
|
6天前
|
存储 前端开发 JavaScript
【前端学java】一篇文章带你精通java 中的数组(10)
【8月更文挑战第10天】一篇文章带你精通java 中的数组
9 3
【前端学java】一篇文章带你精通java 中的数组(10)
|
6天前
|
Java 索引
java中的栈(利用数组实现栈)
这篇文章通过Java代码示例介绍了如何使用数组实现栈操作,包括栈的初始化、入栈、出栈、判断栈满和空以及遍历栈的方法。
java中的栈(利用数组实现栈)
|
6天前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
5天前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
6天前
|
搜索推荐 算法 Java
|
4天前
|
算法 Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
9 0
|
4天前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。