一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1020|回复: 4
收起左侧

[编程题] 这个要用些什么结构比较好 求助~

[复制链接] |试试Instant~ |关注本帖
milanelllo13 发表于 2015-7-18 06:21:35 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
我基础比较差。。实在想不到什么技巧

[size=12.8000001907349px]Given a data file containing hotel deals, write an app to find the best applicable deal for the user and return the promo_txt for the deal. You will need to consider the type of deal, valid dates, hotel name, and edge cases. If no deal applies you will return “no deals available”. You may assume the entire deals file fits in memory. You may use Java, C++, C#, or Python for your solution with the standard libraries at your disposal.
[size=12.8000001907349px]The types of deals are as follows:
[size=12.8000001907349px]    rebate : a straight discount off the total price of the stay
[size=12.8000001907349px]    rebate_3plus : a straight discount off the total price when the duration of stay is >= 3
[size=12.8000001907349px]    pct : a percentage discount off the total price of the stay
[size=12.8000001907349px]The deals data file will be a comma-separated file (CSV) in the following format:
[size=12.8000001907349px]hotel_name,nightly_rate,promo_txt,deal_value,deal_type,start_date,end_date
[size=12.8000001907349px]Hotel Commonwealth,250,$50 off your stay 3 nights or more,-50,rebate_3plus,2015-06-01,2015-07-31
[size=12.8000001907349px]Hotel Commonwealth,250,5% off your stay,-5,pct,014-06-01,2015-06-15
[size=12.8000001907349px]Hotel Commonwealth,250,$25 off your stay,-25,rebate,2015-07-07,2015-07-31   

[size=12.8000001907349px]The input to your application will be the path to the deal file, the hotel name, check in date, and number of nights stay. For example:
[size=12.8000001907349px]> BestHotelDeal ./deals.csv “Hotel Commonwealth” 2015-06-30 3
[size=12.8000001907349px]Any errors resulting from bad parameters and/or invalid deal file should be handled gracefully, with informative feedback to the user.
[size=12.8000001907349px]Examples:
[size=12.8000001907349px]> BestHotelDeal ./deals.csv  "Hotel Commonwealth" 2015-06-30 3
[size=12.8000001907349px]> $50 off your stay 3 nights or more
[size=12.8000001907349px]> BestHotelDeal ./deals.csv  "Hotel ABC" 2015-06-30 1
[size=12.8000001907349px]> 5% off your stay
[size=12.8000001907349px]> BestHotelDeal ./deals.csv  "Hotel ABC" 2015-06-30 2
[size=12.8000001907349px]> no deal available

stellari 发表于 2015-7-19 00:11:08 | 显示全部楼层
这题如果是可以把所有的deal先预读到内存中,那么可以这样:

首先定义一个Hotel类:
class Hotel {
    string name;
    vector<Deal*> deals;
}
然后是Deal类,这是个抽象类:
class Deal {
    Date start, end;
    Hotel* hotel;
    string promo_txt;
    pair<Date, Date> checkOverlap(Date checkin, int days) {\\检查入住日期和Deal日期是否重叠;}
    virtual string getDeal(Date checkin, int days) = 0; \\获得入住日期的Deal,
};

然后Deal有三个派生类:
DealPct, DealRebate, DealRebate3Plus,
分别以三种不同方式implementgetDeal函数,比如DealRebate的getDeal函数是:
string getDeal(Date checkin, int days) {
    pair<Date, Date> dealDates = checkOverlap(checkin, days);
    if (dealDates.second > SOME_PREHISTORIC_DATE) return promo_txt;
    else return "No deal available";
}

最后一步是把所有的Hotel存在一个HashMap hotelMap中,其中的映射是{HotelName->Hotel*}。

每次用户提交一个查询时:
1. 在hotelMap中查找对应的Hotel对象地址;获得其所有的Deal
2. 顺次对其deals数组中的每个Deal调用一次checkOverlap,如果确定有overlap,则进一步调用getDeal来获得string; 如果无overlap,则检查下一个Overlap即可。

-------------------------------

如果这个题是说每调用BestHotelDeal都必须重新读一遍deals.csv,那么我们就不建立HashMap,也不用建立Hotel类了。只要依次将每行的内容一次读入到一个Deal当中,检查这个Deal是否匹配输入,如果不匹配,直接跳到下一行;如果匹配则输出promo_txt。
回复 支持 反对

使用道具 举报

 楼主| milanelllo13 发表于 2015-7-19 11:52:48 | 显示全部楼层
stellari 发表于 2015-7-19 00:11
这题如果是可以把所有的deal先预读到内存中,那么可以这样:

首先定义一个Hotel类:

谢谢这么详细的解答。
终于写完了   
太感激了
回复 支持 反对

使用道具 举报

ushergod 发表于 2015-7-23 11:42:09 | 显示全部楼层
stellari 发表于 2015-7-19 00:11
这题如果是可以把所有的deal先预读到内存中,那么可以这样:

首先定义一个Hotel类:

如果只有一个deal类,在类中有一个dealtype 然后通过这个变量 map 到三个不同的函数(get value)。
self.dealmap = {
    'reboate' : func1,
    'rebate_plus3': func2,
    'ptc': func3
}

这样的话是不是也可以, 只不过这点不好在于 每次都需要有一次映射 来call 函数,不过个人感觉并不会影响效率

在下新手 多指教 谢谢
回复 支持 反对

使用道具 举报

stellari 发表于 2015-7-23 21:20:50 | 显示全部楼层
ushergod 发表于 2015-7-23 11:42
如果只有一个deal类,在类中有一个dealtype 然后通过这个变量 map 到三个不同的函数(get value)。
sel ...

我的设计模式知识比较弱,所以我不好说这种方法和继承+多态比起来孰优孰劣。这种方法肯定可以满足此题的要求,但是似乎不是那么具有面向对象编程风格。面试时我觉得还是尽可能使用常见,规范的OOP设计模式为佳。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-11 09:01

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表