
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. 挺有意思的,之前只是大概会用,如果深入了解的话,之后在用的时候就更加头脑清晰,知道自己在干嘛。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)