当前位置: 首页 > 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
  • [nginx文档翻译系列] 控制nginx
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Angular2开发踩坑系列-生产环境编译
  • ES6 学习笔记(一)let,const和解构赋值
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java,console输出实时的转向GUI textbox
  • Java知识点总结(JavaIO-打印流)
  • js
  • Laravel Mix运行时关于es2015报错解决方案
  • laravel with 查询列表限制条数
  • laravel5.5 视图共享数据
  • PAT A1017 优先队列
  • rc-form之最单纯情况
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Unix命令
  • 程序员该如何有效的找工作?
  • 从0到1:PostCSS 插件开发最佳实践
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 思否第一天
  • 我有几个粽子,和一个故事
  • 线性表及其算法(java实现)
  • 用mpvue开发微信小程序
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 再次简单明了总结flex布局,一看就懂...
  • 再谈express与koa的对比
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #if #elif #endif
  • #pragma multi_compile #pragma shader_feature
  • (2)nginx 安装、启停
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot教学评价 毕业设计 641310
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程