网易的一道笔试题的参考解法---关于广告牌投放问题

有N个广告牌(N<=10万)可以投放广告,有k个用户(k<10亿)在这些广告牌上投放广告.操作rent(i,j,k)将从i到j块广告牌展示用户k的广告,如果原来有别的广告就覆盖掉. 操作query(i)返回第i个广告牌上现在投放的是哪个广告. rent和query操作出现的频率相等.要求设计一个数据结构和相应的算法,尽可能快的实现这两种操作.

  1 package test;
  2
  3 import java.util.HashMap;
  4 import java.util.Map;
  5
  6 public class Signboard {
  7     private Map<Integer, AD> boards;
  8
  9     public Signboard() {
 10         super();
 11         boards = new HashMap<Integer, AD>();//Integer参数记录广告牌的位置,AD参数记录广告内容
 12     }
 13
 14     public void rent(int begin, int end, AD ad) {
 15         for (int i = begin; i <= end; i++) {
 16             boards.put(i, ad);
 17         }
 18     }
 19
 20     public AD query(int i) {
 21         return boards.get(i);
 22     }
 23
 24     public static void main(String[] args) {
 25         Signboard signboard = new Signboard();
 26         User user = new User(1, "zhangsan", "手机号","邮箱");
 27         AD ad = new AD(1, "ad_content", user);
 28         signboard.rent(3, 5, ad);
 29         System.out.println(signboard.query(4));
 30
 31     }
 32 }
 33
 34 class User {
 35     private int id;
 36     private String name;
 37     private String tel;
 38     private String email;
 39
 40     public User() {
 41         super();
 42         // TODO Auto-generated constructor stub
 43     }
 44
 45     public User(int id, String name, String tel, String email) {
 46         super();
 47         this.id = id;
 48         this.name = name;
 49         this.tel = tel;
 50         this.email = email;
 51     }
 52
 53     public int getId() {
 54         return id;
 55     }
 56
 57     public void setId(int id) {
 58         this.id = id;
 59     }
 60
 61     public String getName() {
 62         return name;
 63     }
 64
 65     public void setName(String name) {
 66         this.name = name;
 67     }
 68
 69     public String getTel() {
 70         return tel;
 71     }
 72
 73     public void setTel(String tel) {
 74         this.tel = tel;
 75     }
 76
 77     public String getEmail() {
 78         return email;
 79     }
 80
 81     public void setEmail(String email) {
 82         this.email = email;
 83     }
 84
 85     @Override
 86     public String toString() {
 87         return "User [id=" + id + ", name=" + name + ", tel=" + tel + ", email=" + email + "]";
 88     }
 89 }
 90
 91 class AD {
 92     int id;
 93     String content;
 94     User user;//广告拥有者的引用
 95
 96     public AD() {
 97         super();
 98         // TODO Auto-generated constructor stub
 99     }
100
101     public AD(int id, String content, User user) {
102         super();
103         this.id = id;
104         this.content = content;
105         this.user = user;
106     }
107
108     public int getId() {
109         return id;
110     }
111
112     public void setId(int id) {
113         this.id = id;
114     }
115
116     public String getContent() {
117         return content;
118     }
119
120     public void setContent(String content) {
121         this.content = content;
122     }
123
124     public User getUser() {
125         return user;
126     }
127
128     public void setUser(User user) {
129         this.user = user;
130     }
131
132     @Override
133     public String toString() {
134         return "AD [id=" + id + ", content=" + content + ", user=" + user + "]";
135     }
136 }
时间: 2024-11-18 11:52:18

网易的一道笔试题的参考解法---关于广告牌投放问题的相关文章

DP - 2016网易杭研笔试题A

2016网易杭研笔试题A Problem's Link ---------------------------------------------------------------------------- Mean: 有一个边长为n的立方体,内部的每一个小立方体内有一个数字.如果取了当前这个小立方体,则小立方体的: 1.上下相邻两层将会消失; 2.前后相邻两列将会消失; 3.左右相邻两个将会消失; 找出一种取法,使得取到的数的sum最大,输出sum. analyse: 现场面试时挂在这题上了

Java中有关构造函数的一道笔试题解析

Java中有关构造函数的一道笔试题解析 1.具体题目如下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与class同名 C. constructor在一个对象被new时执行 D.一个class只能定义一个constructor 2.解析说明 (1)class中的构造函数是可以省略的 /** * @Title:User.java * @Package:com.you.user.model * @Descrip

0810------笔试题----------腾讯2012年的一道笔试题

1.题目要求 a)b[i] = a[0] *a[1] *a[2]*….a[n-1]/ a[i],求出数组b: b)要求不能用除法,除循环控制变量以外,不许额外申请其余变量,时间复杂度为O(n),空间复杂度为O(1). 2.程序思路 a)假设 N = 5,那么 b[0] =      a[1]*a[2]*a[3]*a[4];            b[1] = a[0]*     a[2]*a[3]*a[4];            b[2] = a[0]*a[1]*     a[3]*a[4];

关于阿里的一道笔试题分析

其题目如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #pragma pack(2) class A { public:     int i;     union U     {         char buff[13];         int i;     }u;     void foo() {    }     typedef char* (*f)(void*);     enum{red, green, blue} color; }a; class A

好玩的一道笔试题

/*实现函数: void f(int a, int b, int c) 编码中不允许出现燃和if,switch,for,while之类的关键词以及"?:"表达式,并要求: a=1时,打印b+c的值: a=2时,打印b-c的值: a=3时,打印b*c的值: a=4时,打印b/c的值. */ 下面是我的解答,哈哈: #include <iostream> int cal(int a,int b, int c){ int res = 0; (!(a^1) && (

送上今年微软的一道笔试题

这里送上一道微软的笔试题,具体题目如下: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. Write a program to find and outp

给定一个数值,输出符合中国人习惯的读法--记一道笔试题

题目:给定一个数字,最大小于一万亿,输出符合中国人习惯的读法,例如: a.12输出:十二 b.102输出:一百零二 c.1002输出:一千零二 d.112输出:一百十二 e.10112输出:一万零一百十二 f.120000000:一亿二千万 g.11021002:一千一百零二万一千零二 h.11020102:一千一百零二万零一百零二 i.1000001:一百万零一 j.1000000001:十亿零一 嗯,一道笔试题,解的很没有节操,没有太好的思路,只能尽力抽取翻译过程中的共有代码,尽量写的不那么

一道笔试题来理顺Java中的值传递和引用传递

前段时间参加了一场面试,其中有一道引用传递的题,因为当时并没有考虑清楚所以做错了. 现在来复盘一下,题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = new StringBuffer("new world"); str12.append("new world");} public static void main(Stri

网易2018校招笔试题-数组能不能满足重排列后任意相邻的元素积都是4的倍数

今天看了一下网易最新的校招笔试题: 小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}.牛博士给小易出了一个难题:     对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数.     小易现在需要判断一个数列是否可以重排之后满足牛博士的要求. 代码如下: 1 import java.util.Scanner; 2 3 /** 4 * Created by jy on 2017/9/9. 5