计算一组数字中最小的若干个数字(Java数组和栈实现)

简介: 本文目录1. 问题2. 思路2.1 思路12.2 思路22.3 思路33. 实现

1. 问题

如果有若干个数字,输入其中所有最小的数字。


例如,输入1 2 3 1 2 1 4 5,则输出1 1 1


2. 思路

2.1 思路1

最简单的思路是排序,按从小到大排序后,第一个就是最小的数字,然后从第一个往后遍历,等于最小数字的输出即可。但是这种方案需要两层循环,时间复杂度是O(n^2),应该寻求更快的方案。


2.2 思路2

想一下人如果去干这件事怎么实现,首先是找到最小的值,然后找与最小值相同的数字即可,这种需要从头到尾扫描数字两遍。


2.3 思路3

还有更快的方案,我只扫描所有数字一遍,把第一个数字当做最小,后面只把小于等于当前数字的记下来。这样我记下来的最后一个数字必然是最小的,然后从后往前看跟最小的数字相同的输出即可。


3. 实现

可以用数组实现,也可以用栈实现。因为输出是从后往前输出,正好符合栈后进先出的特点。代码如下:

/**
 * 获取最小的若干数字
 * @author maoge
 * @date 2019-02-27
 */
public class GetMinNum {
  /**
   * 入口
   */
  public static void main(String[] args) {
    int[] input = { 1, 2, 3, 1, 2, 1, 4, 5 };
    System.out.println("====数组计算结果====");
    getMinNumByArray(input);
    System.out.println("");
    System.out.println("====栈计算结果====");
    getMinNumByStack(input);
    System.out.println("");
  }
  /**
   * 通过数组计算最小的几个数字
   */
  public static void getMinNumByArray(int[] input) {
    //定义用来输出的数组
    int[] output = new int[input.length];
    //输出数组当前操作位置
    int location=0;
    output[location]=input[0];
    for (int i = 1; i < input.length; i++) {
      if (input[i] <= output[location]) {
        location++;
        output[location]=input[i];
      }
      i++;
    }
    //打印结果
    for(int j=location;j>=0;j--) {
      //output[location]是最小值
      if(output[location]==output[j]) {
        System.out.print(output[j]);
      }
    }
  }
  /**
   * 通过栈计算最小的几个数字
   */
  public static void getMinNumByStack(int[] input) {
    Stack<Integer> stack=new Stack<Integer>();
    int min=input[0];
    stack.push(min);
    //不大于最小的入栈
    for (int i = 1; i < input.length; i++) {
      if(input[i]<=min) {
        stack.push(input[i]);
      }
    }
    //栈顶元素就是最小的元素
    int peek=stack.peek();
    while(stack.isEmpty()==false) {
      int num=stack.pop();
      if(num==peek) {
        System.out.print(num);
      }
    }
  }
}


//

相关文章
|
16天前
|
存储 Java
java中的常见运算符的计算方式
本文介绍了计算机中二进制数的原码、反码和补码的概念及其转换方式。原码是符号位加真值的绝对值;反码中正数不变,负数其余位取反;补码在反码基础上加1。文章还详细解释了Java中的常见运算符(如按位与、或、异或、移位等)如何基于二进制进行计算,并探讨了使用补码的原因,包括统一符号位处理和扩展表示范围。通过具体代码示例帮助理解这些概念。
java中的常见运算符的计算方式
|
16天前
|
存储 JavaScript Java
如何在Java中计算绝对值
绝对值表示一个数离0的距离,总是非负的。在Java中,可以通过`Math.abs()`函数或`if-else`条件语句来计算绝对值。使用`Math.abs()`可直接将负数转为正数,而`if-else`则根据条件判断是否取反。本文介绍了这两种方法的具体实现步骤和代码示例,并展示了如何通过用户输入获取数值并输出其绝对值。此外,还提供了完整的代码和编译执行的方法。
如何在Java中计算绝对值
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
69 5
|
2月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
86 2
|
2月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
2月前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
67 2
|
3月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
42 4
|
3月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
52 2
|
3月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
112 2
|
2月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
44 0