栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HJ8合并表记录(解法以及其中值得思考的细节)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HJ8合并表记录(解法以及其中值得思考的细节)

HJ8合并表记录(解法以及其中值得思考的细节)

题目描述:
数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
例如:
	输入:
	4
	0 1
	0 2
	1 2
	3 4

	输出:
	0 3
	1 2
	3 4
	
首先想到的是用java中的map类保存键对值,但是这个类的一般类是没有排序的作用,且对于内存占用较多。不过后来据查找资料了解到java中Map的子类TreeMap是会自动按照升序排列,如果用上可以少写排序方法。
为了节省内存,我使用两个整型数组:key[],value[]来分别保存键队值,他们的对应关系取决于他们的公共索引,其实也就是在查找时,先找到key表中对应的key的索引 i ,然后直接读取value[i]就可以获取到对应key的值。
需要注意的是,前面两个数组的大小需要提前确定且应该为第一次输入的N(实际使用空间小于等于N),且为了后续遍历输出不溢出(数组空间没用完),应当额外定义一个整型数size来记录用到的空间的最大索引数。

详细操作不再赘述(直接插入排序),其中我觉得比较有意思的细节是:
	1: 对于插入排序的元素后移,以前比较脑瘫,总是通过从前往后移动,先定义一个变量tmp保存当前位置的值,然后把当前位置值改写成前一次循环时的tmp(tmp初始化为需要插入元素的值)。其实完全可以从后往前逐个移动,当移动到需要插入的位置时将值改写插入值就行。
	2: 需要特殊考虑初始化时和插入位置在最后(直接扩容)这两种情况。
	3: 对于Scanner类的方法的具体使用(比较重要),Scanner类中主要有 hasNext(),next(),nextLine(),nextInt()这些。需要知道的是,hasNext主要为了判定是否还有输入,在确保规范输入时不用加上也没问题。next是判断到空格暂停读取,且只是暂停,且经过测试与换行无关。也就是说,除了nextLine()是以换行符为一次读取的分隔符,其他如 next,nextInt,nextFloat之类的都是同时以空格跟换行来分段读取。如用 next读取字符串“aaa bbb ccc n ddd”,只要连续调用四次next就可以读取到aaa bbb ccc ddd。
	而在之前,我一直以为对输入的读取都是按照换行符来结束的,即对(“aaa bbb”)如果只是调用一次next,那么只能读取到部分输入,然后系统就开始对下一次输入进行读取,直接丢弃 ”bbb“。后来想了想,感觉Scanner方法的读取更像水流,水流是不能跳过的,如果里面还有内容,那么就会一直按顺序读,除非你空使用nextLine,这时也是读取了nextLine,只是没有保存(空读)所以感觉跳过了。并且,经过测试,对于hasNextXXX方法,实际用途更像是 
	has next and next is XXX.

挺有意思的,之前只是大概会用,如果深入了解的话,之后在用的时候就更加头脑清晰,知道自己在干嘛。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692296.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号