[经典面试题]求解集合A与B的差集

【题目】

已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。

例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。

结构体:

struct ListNode{
    int val;
    ListNode *next;
};

请完成函数void difference(ListNode** LA , ListNode* LB)

------迅雷校招

【代码一】

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

struct ListNode{
    int val;
    ListNode *next;
};

// 输出集合
void Display(ListNode* root){
    ListNode* p = root;
    while(p){
        cout<<p->val<<endl;
        p = p->next;
    }
}

// 求两个集合的差集保存在LA中
void Difference(ListNode** LA,ListNode* LB){
    // 容错处理
    if(*LA == NULL || LB == NULL){
        return;
    }
    ListNode *pa,*pb,*pre,*node;
    pa = *LA;
    pre = NULL;
    bool isDelete;
    // 遍历LA
    while(pa){
        pb = LB;
        isDelete = false;
        while(pb){
            // 删除pa
            if(pa->val == pb->val){
                isDelete = true;
                // 头元素
                if(pre == NULL){
                    *LA = pa->next;
                    pa = *LA;
                }//if
                else{
                    node = pa;
                    pre->next = pa->next;
                    delete node;
                    pa = pre->next;
                }
                break;
            }//if
            pb = pb->next;
        }//while
        // 如果有删除pa跳到pa->next
        if(!isDelete){
            pre = pa;
            pa = pa->next;
        }
    }//while
}

int main(){
    int arrayA[] = {5,10,20,15,25,30};
    int arrayB[] = {5,15,35,25};
    ListNode* node;
    // 集合A
    ListNode *LA = (ListNode*)malloc(sizeof(ListNode));
    LA->val = 5;
    LA->next = NULL;
    ListNode *p = LA;
    for(int i = 1;i < 6;i++){
        node  = (ListNode*)malloc(sizeof(ListNode));
        node->val = arrayA[i];
        node->next = NULL;
        p->next = node;
        p = node;
    }

    // 集合B
    ListNode *LB = (ListNode*)malloc(sizeof(ListNode));
    LB->val = 5;
    LB->next = NULL;
    p = LB;
    for(int i = 1;i < 4;i++){
        node  = (ListNode*)malloc(sizeof(ListNode));
        node->val = arrayB[i];
        node->next = NULL;
        p->next = node;
        p = node;
    }

    // 求AB差集
    Difference(&LA,LB);
    // 输出AB差集
    Display(LA);
}

【代码二】

// 求两个集合的差集保存在LA中
void Difference(ListNode** LA,ListNode* LB){
    // 容错处理
    if(*LA == NULL || LB == NULL){
        return;
    }
    ListNode *pa,*pb,*pre,*node;
    pa = *LA;
    pre = NULL;
    // 遍历LA
    while(pa){
        pb = LB;
        // 遍历直到末尾
        while(pb != NULL && pa->val != pb->val){
            pb = pb->next;
        }//while
        // pb中没有与之相同元素
        if(pb == NULL){
            pre = pa;
            pa = pa->next;
        }
        // 有相同元素
        else{
            // 头元素
            if(pre == NULL){
                *LA = pa->next;
                pa = pa->next;
            }
            else{
                node = pa;
                pre->next = pa->next;
                pa = pa->next;
                delete node;
            }//if
        }//if
    }//while
}
时间: 2024-11-18 10:41:31

[经典面试题]求解集合A与B的差集的相关文章

[经典面试题]最大连续乘积

题目 给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8.也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的. 分析 最大乘积连续子串与最大乘积子序列不同,前者子串要求连续,后者子序列不要求连续.初看此题,自然会想到最大连续乘积问题类似于最大子数组和问题 思路一 穷举法 穷举子串的起点和终点. 代码一 /*------------------------------------

[经典面试题]在O(1)时间删除链表结点

[题目] 给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode {     int        value;     struct ListNode*  next; }; 函数的声明如下: void DeleteNode(ListNode* head,ListNode* node); [思路] 这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解. 在链表中

[经典面试题]将字符串里的小写字母转换成大写的。 要求不通过比较

[题目] 将字符串里的小写字母转换成大写的. 要求不通过比较 --------腾讯校招 [思路] a~z的ascii码:97~122 也就是:1100001~1111010 A~Z的ascii码:65~90 也就是: 1000001~1011010 通过判断从低位数第五位是否是0,1而得到是小写字母还是大写字母 [代码] /********************************* * 日期:2014-11-21 * 作者:SJF0115 * 题目: 将字符串里的小写字母转换成大写的.

经典SQL语句大集合

经典SQL语句大集合,下列语句部分是Mssql语句,不可以在access中使用. 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL-数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库 CREATE DATABASE database-name

PHP经典面试题集锦

 这篇文章主要介绍了PHP经典面试题集锦,搜集整理了常见的php面试题与相关的参考答案,供大家参考借鉴,需要的朋友可以参考下     本文较为详细的分析了PHP经典面试题.分享给大家供大家参考.具体如下: 做了一下网络上的php题目,不知不觉做到现在.....把答案贴出来,供参考之用. 1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) ? 1 2 $a = date("Y-m-d H:i:s", strtotime("-1 day")

嵌入式面试题求解:给你一个8M连续内存,如何管理使用

问题描述 嵌入式面试题求解:给你一个8M连续内存,如何管理使用 给你一个8M连续内存,如何实现申请和释放,请考虑所有情况,给出最好的实现. 解决方案 可以参考操作系统原理里面说的分页.分段的方式来使用.不存在最好的实现,要考虑性能和利用率,如果希望利用率大,那么性能必然要影响,反之,如果要高效,就得牺牲一些存储效率. 解决方案二: 可以用全局二位字节数组占用掉,然后采用一定的算法管理这些分配掉的内存块,来实现简单的内存分配管理,参考uCOS-II的实现. 解决方案三: 双向链表控制 设置最小si

[经典面试题]子数组的最大乘积

题目 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中的最大的一组,并写出算法的时间复杂度. 思路一 穷举法 我们把所有可能的(N-1)个数的组合找出来,分别计算它们的乘积,并比较大小.由于总共有N个(N-1)个数的组合,总的时间复杂度为O(N^2),但显然这不是最好的思路. 思路二 空间换时间 计算(N-1)个数的组合乘积,假设第i个(0<=i<=N-1)元素被排除在乘积之外(如下图). 设num[]为初试数组 Left[i]表示前i个元素(包括第i个

[经典面试题]二分查找问题汇总

[算法]二分查找算法 1.[给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1.] [题目] 给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1. [分析] 此题也就是求target在数组中第一次出现的位置.这里可能会有人想先直接用原始的二分查找,如果不存在直接返回-1, 如果存在,然后再顺序找到这个等于target值区间的最左位置,这样的话,最坏情况下的复杂度就是O(n)了,没有完全发挥出二

[经典面试题][字典树]字符串唯一前缀问题

题目 一个文件里面有如下字符串 cartefdxh cart carlkijfwe chdfwef cafkekfld ---- 要从文件中找出唯一能代表该字符串的前缀,然后如下输出 cartefdxh carte cart cart carlkijfwe carl chdfwef ch cafkekfld caf 以空格分隔--. 思路 用Trie树实现.为每个节点增加一个变量count,用来记录一共有几个字符串使用该字符.找节点计数为1的节点或者叶子节点. 代码 /*------------