Poj百练 2503: Babelfish (分类:二分)

字符串二分搜索与C++基础操作
本文介绍了一道关于字符串的二分搜索题目,使用C++实现,包括cin.get()与cin.peek()的使用,以及无限循环的实现方式。通过实际代码展示了如何进行字符串的比较和排序,并运用二分法进行高效查找。

一道简单字符串相关的二分题

题中有些OJ中常见的基础操作,下面是笔记:

 

cin.get() & cin.peek()

前者是观测并移除输入流的最后一个字符,类似出栈,经常用来舍弃回车等不需要的操作

后者是只用来获取输入流的最后一个字符

用例:当要求输入回车作为结尾,但输入内容中包含回车时

 

while(true): 无限循环  for(;;)一样

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

struct Entry{
    char english[11];
    char foreign[11];
}entries[100005];

int Cmp(Entry entry1, Entry entry2 )
{
    return strcmp(entry1.foreign, entry2.foreign) < 0;
}

int main()
{
    int num = 0;
    char word[11];
    while(true){
        scanf("%s%s", entries[num].english, entries[num].foreign);
        num++;
        cin.get();      //去掉行尾的换行符
        if(cin.peek() == '\n')    //查看是否空行
            break;
    }

    sort(entries, entries+num, Cmp);//按照Cmp中的规则进行排序

    while(scanf("%s",word) != EOF)
    {
        int left = 0, right = num-1;
        int n = 0;
        //二分查找
        while( left <= right){
            int mid = left + (right-left)/2;
            n = strcmp(entries[mid].foreign, word);
            if(n < 0)
                left = mid+1;
            else if(n > 0)
                right = mid-1;
            else{
                printf("%s\n",entries[mid].english);
                break;
            }
        }
        if(n)
            printf("eh\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值