程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> NYOJ163 Phone list

NYOJ163 Phone list

編輯:C++入門知識

題目分析:
這道題也就是給定電話號碼,然後看較短的號碼是不是較長的號碼的前綴,如果是的話就輸出NO,否則就輸出YES。首先,作為一個二逼青年,我第一時間想到的肯定是把所有的電話號碼排序,這樣只可能前一個字符串是後一個字符串的前綴了。當然還可以進行減枝,如果兩個字符串的第一個字符不等,或者前一個字符串的長度比後一個字符串的長度長。如果是前綴的話,長度肯定是小於等於撒~
先給出二逼的解法,稍後給出文藝點的解法。OK,文藝青年來襲~~

[cpp]
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
 
int compare(const void *a, const void *b) 

    return strcmp((char *)a, (char *)b); 

 
const int Len = 13;//電話號碼最多就11位吧,加一個'\0';  
char phone[100000][Len]; 
 
int main() 

    int t,i,n; 
    int nLen1,nLen2; 
    char *p1; 
    char *p2; 
    bool flag; 
    scanf("%d", &t); 
    while(t--) 
    { 
        scanf("%d", &n); 
        for(i = 0; i < n; ++i) 
            scanf("%s", phone[i]); 
        flag = false; 
        qsort(phone, n, Len, compare); 
        for(i = 0; i < n - 1; ++i) 
        { 
            if(phone[i][0] != phone[i + 1][0])//第一位就不等  
                continue; 
            nLen1 = strlen(phone[i]); 
            nLen2 = strlen(phone[i + 1]); 
            if(nLen1 <= nLen2)//前一個的長度小於後一個  
            { 
                p1 = phone[i]; 
                p2 = phone[i + 1]; 
                while(*(++p1) == *(++p2)) ;//這個空循環看懂了麼?  
                if(*p1 == '\0') 
                { 
                    flag = true; 
                    break; 
                } 
            }            
        }//end for  
        if(flag) 
            printf("NO\n"); 
        else 
            printf("YES\n"); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved