当前位置:首页 > 题解目录 > 正文内容

【题解】剔除相关数

亿万年的星光4年前 (2021-11-17)题解目录2035

【题目描述】

一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。

【输入描述】

每组数据前有一个N(<1000),表示跟随的整数P(0

【输出描述】

按从小到大的顺序输出非相关数,若没有非相关数,则输出None

【样例输入】

8
213 667 3 213 43 34 677 2
3
322 232 232
0

【样例输出】

2 3 667 677
None

【题目分析】

  • 比较简单的一道模拟题,拆分数字进行比较即可

  • 双重for循环两两比较,把不相关的数加到新数组里

  • 长度不相同,一定不相关。长度相同的情况下,如果有其中任何一个数字没有对应则不相关

  • 注意特殊情况,677和667长度一样,但是6的数量和7的数量不同。(写到这里,我突然想起了桶排!)



【解题思路】

  • 思路一:纯暴力穷举,把数一个个挨个拆开,然后做比较。

  • 思路二:数字拆分后可以用桶排的方法来比较长度和数字是否一样。

  • 思路三:考虑将数字转换成字符串,用字符串的特点进行比较。



【参考答案一】:纯暴力计算


#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n; //数字个数 
const int maxn=10001;
int Length(int n){    /*每个数的长度  如100长度是3*/ 
    int len=0;
    while(n){
        n/=10;
        len++;
    }
    return len;
}
int Equal(int n,int m){  /* 判断每两个数的是否相等*/ 
    int M[21],N[21];   //保存两个数分解出来的数 
    int t=0,k=0;
    while(n){       /*因为长度是相等的,所以只要一个数满足不为零就可以了*/ 
        N[t]=n%10;
        M[t++]=m%10;
        n/=10;
        m/=10;
    }
    sort(N,N+t);    /*进行从小到大排序*/ 
    sort(M,M+t);
    for(int i=0;i<t;i++){   /*如果两个数分解出来的数不相等 说明两个数不相关*/ 
        if(N[i]!=M[i])
            return 0;
    }
    return 1;  /*两个数相等,返回真*/ 
}
int main(){
    while(cin>>n&&n){
        int a[maxn];
        for(int i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);    /*进行从小到大排序,主要方便输出*/ 
        int Len[maxn],flag[maxn];  /*Len[] 保存每个数的长度,flag[]对相关数进行标记*/ 
        memset(Len ,0 ,sizeof(Len));  /*数组清零*/ 
        memset(flag ,0 ,sizeof(flag));    /*数组清零*/ 
        for(int i=0;i<n;i++){
            Len[i]=Length(a[i]);    /*求每个数的长度*/ 
        }
        for(int i=0;i<n;i++){       /*暴力解题*/ 
            for(int j=i+1;j<n;j++){
                if(Len[i]==Len[j]){ /*长度不相等就跳过了*/ 
                    if(Equal(a[i],a[j])){   /*满足相关数进行标记*/ 
                        flag[i]=1;
                        flag[j]=1;
                    }
                }
            }
        }
        int Ans=0; /*用来判断是不是有些数不是相关数*/ 
        for(int i=0;i<n;i++){
            if(flag[i]==0){
                cout<<a[i]<<" ";
                Ans++;
            }
        }
        if(Ans==0)
            cout<<"None";
        cout<<endl;
    }
    return 0;
}


【参考答案二】

扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 模拟
分享给朋友:

相关文章

【题解】母牛的故事

【题解】母牛的故事

【题目描述】有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?【输入描述】输入数据由多个测试实例组成,每个测试实例占一行...

【题解】2019 T2 公交换乘

【题目描述】著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:1、在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠...

【题解】跳格子

【题目描述】地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能...

【题解】分发饼干

【题目描述】假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;...

【题解】金银岛

题目描述某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种...

【题解—动态规划】背包问题1

【题目描述】一个旅行者有一个最多能装 m 公斤物品的背包,现在有 n 件物品,它们的重量分别是 w1,w2,…,wn, 它们的价值分别为 c1,c2,…cn 。若每种物品只有一件,求旅行者能获得的最大...