我无法想象这个面试问题。
你有一个整数数组。您需要提供另一个具有以下功能的数据结构:
int get(int index)
void set (int index, int value)
void setall(int value)
他们都做你猜他们想做的事情。 限制是每个函数都在O(1)中。
如何设计它以便setAll为O(1)。
我考虑过为每个整数添加另一个字段,这将指向每次调用setAll时都会更改的整数。当有人调用 setAll 然后设置然后获取时,问题就出现了。
编辑:我更改了变量的名称,以便更清楚。另外,既然你问,get假设返回array [i],设置(index,value)假设把值值放在数组[index]中。
在setall(index, value)
之后,对于阵列中的每个i,j都应get (get(i) == get(j) == value)
。
答案 0 :(得分:31)
如何为每个变量存储“版本号”,即
int globalValue, globalVersion;
int nextVersion;
int[] localValue, localVersion;
int get(int i) {
if (localVersion[i] > globalVersion)
return localValue[i];
else
return globalValue;
}
void set(int i, int value) {
localValue[i] = value;
localVersion[i] = nextVersion++;
}
void setAll(int value) {
globalValue = value;
globalVersion = nextVersion++;
}
答案 1 :(得分:11)
使用数组中的每个元素,setAllValue变量和setAllDateTime变量保留DateTime字段(或简称为计数器)。使用每个集合,更新元素的DateTime / counter。使用SetAll,更新setAllDateTime的值和DateTime。
在get中,将SetAll的DateTime与元素的DateTime进行比较,以较新者为准,返回该值。