当前位置: 首页 > news >正文

(Java)【深基9.例1】选举学生会

【深基9.例1】选举学生会

    • 一、题目描述
    • 二、输入格式
    • 三、输出格式
    • 四、样例输入
    • 五、样例输出
    • 六、失败经历
    • 七、正确代码
    • 八、正确思路及易错点
      • (1)题目分析
      • (2)思路分析
      • (3)StringBuffer: 线程安全的可变字符串
      • ①StringBuffer类概述
      • ②StringBuffer对象的初始化
      • ③StringBuffer类支持的主要方法
      • ④StringBuffer类中和 String 类类似的方法

)

一、题目描述

学校正在选举学生会成员,有 n ( n ≤ 999 ) n(n\le 999) n(n999) 名候选人,每名候选人编号分别从 1 到 n n n,现在收集到了 m ( m < = 2000000 ) m(m<=2000000) m(m<=2000000) 张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。

二、输入格式

输入 n n n m m m 以及 m m m 个选票上的数字。

三、输出格式

求出排序后的选票编号。

四、样例输入

5 10
2 5 2 2 5 2 2 2 1 2

五、样例输出

1 2 2 2 2 2 2 2 5 5

六、失败经历

  • 乍一看这个题目,感觉好简单啊,一个Arrays类的sort方法就可以解决了,结果并不然,第一次尝试虽然对了,但没有完全对,用sort方法超时了啊啊啊!
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] number = new int[m];
        for (int i = 0; i < m; i++) {
            number[i] = sc.nextInt();
        }
        Arrays.sort(number);
        for (int i = 0; i < m; i++) {
            System.out.print(number[i] + " ");
        }
    }
}

在这里插入图片描述

  • 然后使用了StringBuffer解决了超时问题,结果又超内存了。。。。。。我炸了
    其实这次已经接近正确答案了,只需将数组的大小再变小一点点就行了
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n + 1];
        int m = sc.nextInt();
        for (int i = 0; i < m; i++) {
            a[sc.nextInt()]++;
        }
        StringBuffer s = new StringBuffer();
        for (int i = 1; i < n + 1; i++) {
            while (a[i]-- != 0){
                s.append(i + " ");
            }
        }
        System.out.println(s);
    }
}

在这里插入图片描述

七、正确代码

经过多次试错,正确答案出现啦!

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] a = new int[sc.nextInt()];
        int m = sc.nextInt();
        for (int i = 0; i < m; i++) {
            a[sc.nextInt() - 1]++;
        }
        StringBuffer s = new StringBuffer();
        for (int i = 0; i < a.length; i++) {
            while (a[i]-- != 0){
                s.append(( i + 1 ) + " ");
            }
        }
        System.out.println(s);
    }
}

在这里插入图片描述

八、正确思路及易错点

(1)题目分析

看题目要求:把选票按照投票数字从小到大排序,而投票数字就是候选人的编号,故该题的意思可理解为把选票按照候选人编号从小到大排序

(2)思路分析

①定义一个数组,数组的下标减去一对应了候选人的编号,数组的内容用来存储每个候选人获得了多少票数。

注意点:由于候选人的编号是从1开始的,而数组下标是从0开始的,我们用a[0]存储1号候选人的得票数,a[1]存储2号候选人的得票数,a[n - 1]存储n号候选人的得票数。此时数组的大小为n

int[] a = new int[sc.nextInt()];

②使用循环进行遍历,统计每个候选人获得的票数

具体思路:每读到某个候选人的编号,就将此编号减一作为下标,读取数组中此下标对应的内容,使其自增1,起到统计候选人票数的效果,题目中提供了一共有m张选票,故总共需要读取m次。

for (int i = 0; i < m; i++) {
    a[sc.nextInt() - 1]++;
}

此时就完成了数组的下标减一对应候选人的编号,数组的内容存储以该下标作为编号的候选人获得了多少票数

③创建字符串缓冲区对象,用于存储数据(StringBuffer类的具体使用在下方)

StringBuffer s = new StringBuffer()

④由于上面数组采取一一对应的存储方式,使得数组下标减去一就是候选人的编号,所以我们只需从下标0到下标n利用for循环遍历数组,再利用while循环控制存储次数。

例如下标1对应的数组内容是7,即2号候选人有7票,即a[1] = 7,满足a[1] – != 0 条件的情况有7种,即可以循环7次, s.append(( i + 1 ) + " ")也就可以执行7次,s中也就存储了7次2

关于存储,是利用了字符串缓冲区对象s来存储选票以及追加空格,用StringBuffer才不会超时和超内存

        for (int i = 0; i < a.length; i++) {
            while (a[i]-- != 0){
                s.append(( i + 1 ) + " ");
            }
        }

⑤最后输出就可以啦

System.out.println(s);

(3)StringBuffer: 线程安全的可变字符串

①StringBuffer类概述

  • 当对字符串进行拼接操作时,每次拼接都会构成一个新的String对象,既耗费时间又浪费空间。故当一个字符串的内容需要被经常改变时就要使用StringBuffer。
  • StringBuffer与String的不同在于:String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。

②StringBuffer对象的初始化

StringBuffer s = new StringBuffer();

③StringBuffer类支持的主要方法

方法作用
public StringBuffer append(String s)将指定的字符串追加到此字符序列
public StringBuffer reverse()将此字符序列用其反转形式取代
public delete(int start, int end)移除此序列的子字符串中的字符
replace(int start, int end, String str)使用给定String中的字符替换此序列的子字符串中的字符

④StringBuffer类中和 String 类类似的方法

方法作用
int capacity()返回当前容量
char charAt(int index)返回此序列中指定索引处的char值
void ensureCapacity(int minimumCapacity)确保容量至少等于指定的最小值
replace(int start, int end, String str)将指定的字符串追加到此字符序列。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将字符从此序列复制到目标字符数组dst
int indexOf(String str, int fromIndex)从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引
int lastIndexOf(String str)返回最右边出现的指定子字符串在此字符串中的索引
int lastIndexOf(String str, int fromIndex)返回 String 对象中子字符串最后出现的位置
int length()将给定索引处的字符设置为ch
void setLength(int newLength)设置字符序列的长度
CharSequence subSequence(int start, int end)返回一个新的字符序列,该字符序列是此序列的子序列
String substring(int start)返回一个新的String,它包含此字符序列当前所包含的字符子序列
String substring(int start, int end)返回一个新的String,它包含此序列当前所包含的字符子序列
String toString()返回此序列中数据的字符串表示形式

相关文章:

  • 不可忽视的 C 语言陷阱!
  • web前端期末大作业 html+css+javascript汽车销售网站 学生网页设计实例 企业网站制作
  • 【数据结构】堆(二)——堆排序、TOP-K问题
  • 关于我的家乡网页设计主题题材——梧州14页HTML+CSS网页
  • Python画一棵茂盛的分形树
  • css知识复习点
  • 公益校园网页制作 大学生网页设计作业 HTML CSS公益网页模板 大学生校园介绍网站毕业设计
  • Qt之天气预报——界面优化篇(含源码+注释)
  • 如果你不是前端,一定不知道我在说什么
  • Spring BOOT 手写一个starter并使用这个starter
  • C/C++停车场管理系统
  • 【C++进阶】C++11新特性上篇(万字详解)
  • C/C++KTV点歌系统
  • 【Linux修炼手册:基本指令(完结)】
  • vmware ESXI 7 升级ESXI 8
  • 2017-09-12 前端日报
  • CentOS6 编译安装 redis-3.2.3
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • es的写入过程
  • Java超时控制的实现
  • js递归,无限分级树形折叠菜单
  • node-glob通配符
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue2.0项目引入element-ui
  • vue-loader 源码解析系列之 selector
  • vuex 学习笔记 01
  • Wamp集成环境 添加PHP的新版本
  • webpack4 一点通
  • 官方解决所有 npm 全局安装权限问题
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 三分钟教你同步 Visual Studio Code 设置
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 算法---两个栈实现一个队列
  • 项目实战-Api的解决方案
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​configparser --- 配置文件解析器​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (五)MySQL的备份及恢复
  • (一)SpringBoot3---尚硅谷总结
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)项目管理杂谈-我所期望的新人
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net打印*三角形
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .php文件都打不开,打不开php文件怎么办
  • .考试倒计时43天!来提分啦!
  • ?php echo ?,?php echo Hello world!;?