数据结构编程题:Phone List

这篇具有很好参考价值的文章主要介绍了数据结构编程题:Phone List。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let’s say the phone catalogue listed these numbers:

段落大意:给定一组电话号码,判断它们是否一致,即没有一个号码是另一个号码的前缀。假设电话目录列出了以下号码:

Emergency 911

Alice 97 625 999

Bob 91 12 54 26

In the case, it’s not possible to call Bob, because the central would direct your call to the emergency line as soon as you had dialed the first three digits of bob’s phone number. So this list would not be sonsistent.

段落大意:在这种情况下,不可能拨打Bob的电话,因为只要你拨打Bob电话号码的前三位,中心就会立即将你的呼叫转接到紧急线。因此,这个列表就不一致。

输入

The first line of input gives a single integer, 1<=t<=40, the number of test cases. Each test starts with n, the number of phone numbers, on a separate line, 1<=n<=10000. Then follows n linss with one unique phone numbers on each line. A phone number is a sequence of at most ten digits.

段落大意:第一行输入一个整数,1<=t<=40,表示测试用例的数量。每个测试用例以一个单独的行n开始,表示电话号码的数量,1<=n<=10000。然后是n行,每行包含一个唯一的电话号码。电话号码是最多包含十位数字的序列。

输出

For each test case, output “YES” if the list is consistent, or “NO” otherwise.

段落大意:对于每个测试用例,如果列表一致,则输出“YES”,否则输出“NO”

输入样例 1 

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

输出样例 1

NO
YES

实现

本题采用Trie树思路文章来源地址https://www.toymoban.com/news/detail-814502.html

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PHONE_LENGTH 11
typedef struct TrieNode {
    struct TrieNode* children[10];
    int isEndOfWord;
} TrieNode;
TrieNode* createTrieNode() {
    TrieNode* node = (TrieNode*)malloc(sizeof(TrieNode));
    for (int i = 0; i < 10; ++i) {
        node->children[i] = NULL;
    }
    node->isEndOfWord = 0;
    return node;
}
int insertPhoneNumber(TrieNode* root, const char* phoneNumber) {
    TrieNode* current = root;
    for (int i = 0; i < strlen(phoneNumber); ++i) {
        int index = phoneNumber[i] - '0';
        if (current->children[index] == NULL) {
            current->children[index] = createTrieNode();
        }
        current = current->children[index];
        if (current->isEndOfWord) {
            return 0;
        }
    }
    current->isEndOfWord = 1;
    for (int i = 0; i < 10; ++i) {
        if (current->children[i] != NULL) {
            return 0;
        }
    }
    return 1;
}
void freeTrie(TrieNode* root) {
    if (root == NULL) return;
    for (int i = 0; i < 10; ++i) {
        freeTrie(root->children[i]);
    }
    free(root);
}
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        TrieNode* root = createTrieNode();
        int consistent = 1;
        for (int i = 0; i < n; ++i) {
            char phoneNumber[MAX_PHONE_LENGTH];
            scanf("%s", phoneNumber);
            if (!consistent) {
                continue;
            }
            consistent = insertPhoneNumber(root, phoneNumber);
        }
        printf("%s\n",consistent?"YES":"NO");
        freeTrie(root);
    }
    return 0;
}

到了这里,关于数据结构编程题:Phone List的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (c语言实现)数据结构链表oj题(2)

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::分析力扣中有关链表的部分题目. 题目来源于:牛客网-题目链接 输入一个链表,输出该链表中倒数第k个结点。 示例: 输入:1,{1,2,3,4,5} 返回值:{5} 创建两个指针: ①

    2024年02月04日
    浏览(55)
  • 【数据结构与算法】:10道链表经典OJ

    思路1:遍历原链表,将 val 所在的节点释放掉。(太麻烦) 思路2:创建新链表,再遍历原链表,找到不为 val 的节点尾插到新链表。 思路1代码实现如下: 注意: 1.当链表为空时,直接返回NULL即可。 2.当尾插上最后一个有效节点时,此时它的 next 可能还与最后一个节点相链接,

    2024年04月14日
    浏览(39)
  • 【Java数据结构 -- 队列:队列有关面试oj算法题】

    只允许在一端进行插入数据操作,在另一端进行删除数据操作得特殊线性表,队列是 先进先出 ,入队:进行插入操作得一端称为 队尾(rear) ,出队:进行删除操作的一端称为 队头(front) 。队列Queue是个接口, 底层通过链表实现的 。 boolean offer(E e) – 入队列 E poll() – 出队

    2024年01月25日
    浏览(48)
  • 【数据结构】C语言实现顺序栈 && OJ题 —— 有效的括号

    👑作者主页:@进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:数据结构

    2024年02月10日
    浏览(43)
  • 【数据结构与算法】一套链表 OJ 带你轻松玩转链表

    ✨个人主页:bit me ✨当前专栏:数据结构 ✨刷题专栏:基础算法   简介: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 示例1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例2: 输入:head = [], val =

    2024年01月22日
    浏览(48)
  • 数据结构基础:P3-树(上)----编程作业02:List Leaves

    本系列文章为浙江大学陈越、何钦铭数据结构学习笔记,系列文章链接如下 : 数据结构(陈越、何钦铭)学习笔记 题目描述: 给定一棵树,按照从上到下、从左到右的顺序列出所有叶结点。 输入格式: 每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数

    2024年02月11日
    浏览(62)
  • 数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)

    在单数组里面历遍找val,如果是val,就删除。不是就跳过。 时间复杂度O(n^2),最坏情况每个都是val。相当于一个等差数列。 比如 下标0开始找,0不是,不动数组 下标1,1不是,不动数组 下标2,2是,删除元素,变成【0,1,2,3,0,4,2】 下标2,2是,删除元素,变成【0,

    2024年01月23日
    浏览(67)
  • 数据结构与算法 | 链表(Linked List)

    链表(Linked List)是一种线性数据结构,它由一系列节点(Node)组成,每个节点包含两部分:数据和指向下(上)一个节点的引用(或指针)。链表中的节点按照线性顺序连接在一起(相邻节点不需要存储在连续内存位置),不像数组一样存储在连续的内存位置。链表通常由

    2024年02月08日
    浏览(50)
  • 数据结构——排序算法(C语言)

    本篇将详细讲一下以下排序算法: 直接插入排序 希尔排序 选择排序 快速排序 归并排序 计数排序 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某写的大小,按照递增或递减0排列起来的操作。 稳定性的概念 假定在待排序的记录序列中,存在多个

    2024年02月08日
    浏览(66)
  • C语言数据结构与算法

    冒泡排序 例题 顺序表下的 冒泡排序 注意:冒泡排序 稳定,最多执行n(n-1)/2次 选择排序不稳定,平均比较次数n(n-1)/2 直接插入排序,是在有序基础上,速度最快且稳定的排序方法。 希尔排序是 不稳定的 顺序查找 二分查找(非递归) 二分查找(递归) 数组 链表 查询 快 慢

    2024年02月06日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包