找落单筷子的长度(数组,排序,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;
    }
}
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
91 8
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
97 7
|
2月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
33 4
|
2月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
40 2
|
2月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
93 2
|
2月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
26 3
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
141 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
35 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
2月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
38 0