7-22 帅到没朋友,为什么,数组b[]只有第一个值改变了

7-22 帅到没朋友,为什么,数组b[]只有第一个值改变了;
分数 20
作者 陈越
单位 浙江大学
当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。

输入格式:
输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:
按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome。

注意:同一个人可以被查询多次,但只输出一次。

输入样例1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
输出样例1:
10000 88888 23333

#include<stdio.h>
int main(){
    int n,a[100*1000],i,j,b[10000],cnt=0,cnt1=0,k,m,t=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&k);
        for(j=0;j<k;j++){
            scanf("%d",&a[j]);
            cnt++;//几个
        }
    }
//    printf("%d ",cnt);
    scanf("%d",&m);
    for(i=0;i<m;i++){
        scanf("%d",&b[i]);
        cnt1++;
    }
//    printf("%d ",cnt1);
    for(i=0;i<cnt1;i++){
        for(j=0;j<cnt;j++){
            if(b[i]==a[j]){
                b[i]=-1;
                break;
            }
        }
    }
/*    for(i=0;i<cnt1;i++){
        printf("%d ",b[i]);
    } */   
    for(i=0;i<cnt1;i++){
        if(b[i]!=-1){
            printf("%05d ",b[i]);
        }
        t++;
    }
    if(t==cnt1)printf("No one is handsome");
}

img

img

从第二个群开始,每次向数组a读数会覆盖上次数据
解决方法:

img

题主的代码三处有问题,第一处是输入数组a[] 的下标问题,第二处是没有将b[] 数组去重,第三处是最后输出结果逻辑判断不对,见注释“修改”,整体修改如下,供参考:

#include<stdio.h>
int main() {
    int n, a[101 * 1001], i, j, b[10001], cnt = 0, cnt1 = 0, k, m, t = 0; // 修改
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &k);
        for (j = 0; j < k; j++) {
            scanf("%d", &a[cnt]); //scanf("%d", &a[j]);  // 修改
            cnt++;//几个
        }
    }
    //    printf("%d ",cnt);
    scanf("%d", &m);
    for (i = 0; i < m; i++) {
        scanf("%d", &b[i]);
        cnt1++;
    }
    // 将 b[]数组去重                       // 修改
    for (i = 0, m = 0; i < cnt1 - m; i++) {
        t = a[i];
        for (j = i + 1; j < cnt1 - m; j++) {
            if (a[j] == t) {

                for (k = j; k < cnt1 - m; k++)
                    a[k] = a[k + 1];
                m++;
            }
        }
    }
    cnt1 -= m;    // 修改
    //    printf("%d ",cnt1);
    for (i = 0; i < cnt1; i++) {
        for (j = 0; j < cnt; j++) {
            if (b[i] == a[j]) {
                b[i] = -1;
                break;
            }
        }
    }
    /*    for(i=0;i<cnt1;i++){
            printf("%d ",b[i]);
        } */
    for (i = 0, t = 0; i < cnt1; i++) {
        if (b[i] != -1) {
            printf(t++ ? " %05d" : "%05d", b[i]); // 修改
        }
    }
    if (!t)  // 修改  if(t==cnt1)
        printf("No one is handsome");
    return 0;
}

  • 算法思路
    1、待查询ID列表中的id,没有出现在任何朋友圈,即可以认为是“帅到没朋友”;2、待查id列表中可能有重复查询的id,题目要求相同id的查询只输出第一次。鉴于此,直接在查询前对列表做个去重。

  • 我仅会点python ,只可以用python 代码实现算法逻辑。

  • python 代码运行效果截屏图片

    img

  • python 代码

#!/sur/bin/nve python
# coding: utf-8


def check(id):
    
    if id not in friends:
        return id


def mydel():
    result = []
    
    for id in checks:
        
        if not id in result:
            result.append(id)
    
    return result 




if __name__ == '__main__':
    # 输入样例1:
    in_s = '''3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888'''

# 输出样例1:
    out_s = '10000 88888 23333'

    friends = [] # 定义朋友圈id数组。
    in_s = in_s.split('\n')
    
    for i in in_s[1:4]:
        friends += i.split()[1:]
        
    checks = in_s[-1].split() # 待查询id列表。
    checks = mydel() # 去重。
    in_ss = '\n'.join(in_s)
    print(f"\n输入:\n{in_ss}\n预期输出:\n{out_s}\n\n实际输出:\n{' '.join([id for id in checks if check(id)])}")


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7659550
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 我们老师给我们花了100个星星的重要,那就是非常重要,快速排序。名字就很嚣张。。。言归正传,快排采用了分治算法。把大问题,分解成小问题。首先我们先找一个基准值,基准值的寻找法,有很多,这里我先用一个取边上值得方法,找到基准值以后呢拿着这个基准值和所有数组比较,使这个数组中比基准值小的都放左边,比基准值大的都放到右边,然后就把原来数组分成三块,中间基准值,左边都是比它小的,右边都是比它大的。然后这两个数组,继续分,一直分。直到他的终止条件,也就是小数组有序了就停止,那么什么时候有序停止呢?小区间长度为1或者长度为0的时候,就是有序了。所有小数组都有序了,那么就是整个数组有序了。只是原理,那么问题,又来了,怎么放左放右呢?我目前会三种。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    算法思想

  • 以下回答来自chatgpt:

    问题描述中给出的是一个朋友圈的问题,我们需要找出帅到没有朋友的人。根据题目中的输入格式和输出格式,我们可以分为以下几个步骤来解决该问题:

    1. 首先,我们需要读取输入的数据。根据输入格式,我们可以通过input函数逐行读取输入数据,并存储到合适的数据结构中。可以使用一个字典来存储朋友圈中的人和他们的朋友列表,还可以用一个列表来存储待查询的人的ID号。

    2. 接下来,我们需要确定哪些人帅到没有朋友。我们可以遍历朋友圈中的每个人,查看他们的朋友列表是否为空。如果为空,就认为这个人帅到没有朋友。

    3. 根据上一步的结果,我们可以将帅到没有朋友的人的ID号存储到一个列表中。

    4. 最后,我们按照输入的顺序输出没有朋友的人的ID号。如果没有人帅到没有朋友,则输出"No one is handsome"。

    下面是具体的代码实现:

    # 读取输入的数据
    N = int(input())  # 朋友圈的个数
    circles = {}  # 存储朋友圈的数据
    for _ in range(N):
        data = input().split()
        K = int(data[0])  # 朋友圈中的人数
        friends = data[1:]  # 朋友圈内的所有人的ID号
        circles[friends[0]] = friends[1:]  # 将朋友圈的数据存储到字典中
    
    M = int(input())  # 待查询的人数
    query = input().split()  # 待查询的ID号
    
    # 找出帅到没有朋友的人
    handsome_list = []
    for person in query:
        if person not in circles or len(circles[person]) == 0:
            handsome_list.append(person)
    
    # 输出结果
    if len(handsome_list) > 0:
        print(' '.join(handsome_list))
    else:
        print("No one is handsome")
    

    这样,我们就可以根据输入的数据找出帅到没有朋友的人的ID号了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^