1064. 朋友数(20)

来源:互联网 发布:江苏国税普通发票软件 编辑:程序博客网 时间:2024/06/09 21:07

如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如123和51就是朋友数,因为1+2+3 = 5+1 = 6,而6就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。注意:我们默认一个整数自己是自己的朋友。

输入格式:

输入第一行给出正整数N。随后一行给出N个正整数,数字间以空格分隔。题目保证所有数字小于104。

输出格式:

首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格。

输入样例:
8
123 899 51 998 27 33 36 12
输出样例:
4
3 6 9 26

思路:看见这道题,时间限制在400ms ,于是使用java解决。
这道题非常简单,但是还是踩到了雷,所以记录一下。
用list来检查是否含有相同的朋友数,没有就添加,同时将不同朋友数的总数加一,最后将list里的数据转到数组中,在转换的时候进行排序,考虑到这些数不多, 所以用了插入排序。

import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Test{  public static void main(String [] args){    Scanner r = new Scanner(System.in);    int n = r.nextInt();    List<Integer> list = new ArrayList<>();    int sum = 0;    for(int i = 0; i < n; i++)    {        int j = r.nextInt();        int k = 0;        while(j > 0)        {            k += j%10;            j /= 10;        }        if(!list.contains(k))//检查这个朋友数是否已经存在        {            list.add(k);//不存在便添加            sum++;        }    }    int[] k = new int[sum];    int j = 0;    for(int i:list)    {        for(int m = 0; m < sum; m++)//插入排序,按数字从大到小排,因为数组中的数默认都是0,所以按从小到大排根本不会插入进去。        {            if(k[m] < i)            {                for(int y = sum - 1; y > m; y--)                    k[y] = k[y-1];                 k[m] = i;                break;            }        }    }    System.out.println(sum);    for(int i = sum - 1; i >=0; i--)//倒序输出。    {        System.out.print(k[i]);        if(i > 0)        {            System.out.print(" ");        }    }    }}

这道题我踩到的雷就是,一开始用了按从小到大的顺序排,结果显示全是0,然后改为从大到小的时候,循环中的初始条件没改,导致有一个测试点错误,检查半天才发现。

仅供参考,本人才疏学浅,如有疑问或改进,欢迎提出,一起进步。

原创粉丝点击