Redian新闻
>
UA的信用卡回国飞机第二件行李没有免费吗?
avatar
UA的信用卡回国飞机第二件行李没有免费吗?# Money - 海外理财
c*r
1
数组只有1-10000,然后size是10001,怎么找到重复的那个
ONSITE题目,让用尽可能多的方法。我能想到的方法是sum之后做减法, Hashtable,
sorting完扫一边, 或者boolean数组存。
当时二逼用了swap的算法不停swap,结果最后自己没弄出来。
想问下这题有什么比较好的解法啊?
avatar
a*1
2
刚从国内回来,本来以为有ua的信用卡可以多一件免费行李的。(用ua信用卡买的机票
)结果被告知不行,说第二件行李免费只针对美国国内的。不知道是不是这样?
avatar
j*6
3
记得有一个XOR的方法
avatar
H*V
4
totally wrong

【在 a*****1 的大作中提到】
: 刚从国内回来,本来以为有ua的信用卡可以多一件免费行李的。(用ua信用卡买的机票
: )结果被告知不行,说第二件行李免费只针对美国国内的。不知道是不是这样?

avatar
s*r
5
O(n)
int findDup(int []a,int n){
long ret=0;
for(int i=0;iret+=a[i]-i;
}
return ret;
}
avatar
w*x
6
应该是美国国内第一件免费吧
avatar
c*a
7
sum后减应该最好了吧
avatar
h*s
8
信用卡给的是first checked bag free。
只有美国国内飞才有意义,因为国际的话第一个本来就免费。

刚从国内回来,本来以为有ua的信用卡可以多一件免费行李的。(用ua信用卡买的机票
)结果被告知不行,说第二件行李免费只针对美国国内的。不知道是不是这样?

【在 a*****1 的大作中提到】
: 刚从国内回来,本来以为有ua的信用卡可以多一件免费行李的。(用ua信用卡买的机票
: )结果被告知不行,说第二件行李免费只针对美国国内的。不知道是不是这样?

avatar
f*t
9
最优解:
int findDup(int[] A) {
int ans = 0;
for (int i = 0; i < n; i++) {
ans ^= A[i];
ans ^= i;
}
return ans;
}
avatar
j*8
10
为啥我用我UA的卡订了3张国内的票,一起飞的,结果第一件也不免费?而且登记group
才是3。。

【在 h****s 的大作中提到】
: 信用卡给的是first checked bag free。
: 只有美国国内飞才有意义,因为国际的话第一个本来就免费。
:
: 刚从国内回来,本来以为有ua的信用卡可以多一件免费行李的。(用ua信用卡买的机票
: )结果被告知不行,说第二件行李免费只针对美国国内的。不知道是不是这样?

avatar
c*r
11
O(n). 一个小bug, i<=n
int findDup(int []a,int n){
long ret=0;
for(int i=0;iret+=a[i]-i;
}
return ret;
}
avatar
h*s
12
我最近订的机票也这样,正奇怪呢。

为啥我用我UA的卡订了3张国内的票,一起飞的,结果第一件也不免费?而且登记group
才是3。。

【在 j*****8 的大作中提到】
: 为啥我用我UA的卡订了3张国内的票,一起飞的,结果第一件也不免费?而且登记group
: 才是3。。

avatar
G*A
13
这个小trick不错

【在 s*******r 的大作中提到】
: O(n)
: int findDup(int []a,int n){
: long ret=0;
: for(int i=0;i: ret+=a[i]-i;
: }
: return ret;
: }

avatar
j*8
14
刚打了客服,让不要在网上付check fee,去机场托运时把卡给他们看一下就行了。。

group

【在 h****s 的大作中提到】
: 我最近订的机票也这样,正奇怪呢。
:
: 为啥我用我UA的卡订了3张国内的票,一起飞的,结果第一件也不免费?而且登记group
: 才是3。。

avatar
m*1
15
你怎么知道挂在这个题上面??你已经给出不少答案了啊
avatar
i*y
16
因为你定的三张票,如果是两张就会显示免费了
三张的话,第三个人的第一件不免费,所以系统会显示25刀。底下有行小字,说每个人
的charge可能会因member级别而不一样,貌似你没看到。

group

【在 j*****8 的大作中提到】
: 为啥我用我UA的卡订了3张国内的票,一起飞的,结果第一件也不免费?而且登记group
: 才是3。。

avatar
c*r
17
我自己一口气说出来以后手贱写了个之前板上看到的swap()的方法,其实复杂度也不咋
地,结果写出问题了...
avatar
m*a
18
最近,UA有单方向的promotion,即便经济舱,中国到美国可以两个免费行李,爸妈昨
天刚到。

【在 a*****1 的大作中提到】
: 刚从国内回来,本来以为有ua的信用卡可以多一件免费行李的。(用ua信用卡买的机票
: )结果被告知不行,说第二件行李免费只针对美国国内的。不知道是不是这样?

avatar
g*y
19
这个真不错,还省去了算总和的时间

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
d*e
20
这个方法妙得很!

【在 s*******r 的大作中提到】
: O(n)
: int findDup(int []a,int n){
: long ret=0;
: for(int i=0;i: ret+=a[i]-i;
: }
: return ret;
: }

avatar
d*o
21
这个也是 O(N)
为啥最优?
是因为bit运算比较快吗?

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
d*3
22
O(n)是最好的了,这个是O(N)里的最好的了,空间O(1),而且位运算比加减快

【在 d**********o 的大作中提到】
: 这个也是 O(N)
: 为啥最优?
: 是因为bit运算比较快吗?

avatar
v*n
23
位运算应该比较快
avatar
f*t
24
做加法写的不好还有溢出的风险

【在 d**********o 的大作中提到】
: 这个也是 O(N)
: 为啥最优?
: 是因为bit运算比较快吗?

avatar
r*9
25
是这样的swap算法吗?也是O(n).
int f(int *a, int n){
int tmp;
for(int i=0; iwhile(a[i]!=i+1){
tmp=a[i];
a[i]=a[a[i]-1];
if(tmp==a[i]) return tmp;
else{
a[a[i]-1]=tmp;
}
}
}
return -1;
}

【在 c*******r 的大作中提到】
: 我自己一口气说出来以后手贱写了个之前板上看到的swap()的方法,其实复杂度也不咋
: 地,结果写出问题了...

avatar
e*s
26
拜服。秒杀的解法

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
l*8
27
这个还是可能溢出。

【在 c*******r 的大作中提到】
: O(n). 一个小bug, i<=n
: int findDup(int []a,int n){
: long ret=0;
: for(int i=0;i: ret+=a[i]-i;
: }
: return ret;
: }

avatar
k*t
28
有个疑问,如果这个数组是sorted, 是不是可以用binary search?每次看到一个元素
,比较小相邻的两个值,没有相等的话,再根据index和对应的值决定向左或向右。这
样只要O(lgn), 不知这个有没有什么问题?
avatar
s*r
29
你再仔细想想

【在 c*******r 的大作中提到】
: O(n). 一个小bug, i<=n
: int findDup(int []a,int n){
: long ret=0;
: for(int i=0;i: ret+=a[i]-i;
: }
: return ret;
: }

avatar
s*r
30
对lz的题目不会溢出
当数组size大到一定程度而且内存能装的下的话
是可能溢出的
位操作可以保证不会溢出

【在 l*********8 的大作中提到】
: 这个还是可能溢出。
avatar
s*r
31
没问题
不过不需要比较相邻的两个值 直接比较a[i]和i就可以

【在 k*******t 的大作中提到】
: 有个疑问,如果这个数组是sorted, 是不是可以用binary search?每次看到一个元素
: ,比较小相邻的两个值,没有相等的话,再根据index和对应的值决定向左或向右。这
: 样只要O(lgn), 不知这个有没有什么问题?

avatar
k*t
32

确实,谢谢拉

【在 s*******r 的大作中提到】
: 没问题
: 不过不需要比较相邻的两个值 直接比较a[i]和i就可以

avatar
t*h
33
如果swap的cost和位运算的一样,应该是swap更好。
avatar
f*t
34
我觉得swap不如位运算。
位运算是把N+1个数全读一遍。
swap概率上平均要读(N+1)/4个数,但对每个数,需要做swap操作的概率是N/(N+1)。也
就是说,要进行N/4次swap。swap的cost不止是位运算的4倍吧。

【在 t*****h 的大作中提到】
: 如果swap的cost和位运算的一样,应该是swap更好。
avatar
r*o
35
这两个O(n)的算法假定数组是sorted的吧?
如果不是sorted有啥好解法?先排序么?
avatar
s*s
36
我觉得这个swap应该没问题吧,你当初是这么写的?
// O(n)
int findDuplicate(vector A) {
// let A[i] == i for i=1, 2, ..., 1000
while(A[0] != A[A[0]]) {
swap(A[0], A[A[0]];
}
return A[0];
}

【在 c*******r 的大作中提到】
: 我自己一口气说出来以后手贱写了个之前板上看到的swap()的方法,其实复杂度也不咋
: 地,结果写出问题了...

avatar
l*s
37
这个不对,while外面还应该有一层循环

【在 s*******s 的大作中提到】
: 我觉得这个swap应该没问题吧,你当初是这么写的?
: // O(n)
: int findDuplicate(vector A) {
: // let A[i] == i for i=1, 2, ..., 1000
: while(A[0] != A[A[0]]) {
: swap(A[0], A[A[0]];
: }
: return A[0];
: }

avatar
b*i
38

最优解:
int findDup(int[] A, int n) {
int ans = n;

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
s*s
39
我觉得不用一个外层循环了,
前提条件是1-10000这10000个数放到10001个slot中,而且只有一个重复。
我们只要能找到一个A[A[0]] == A[0]就足够了。
你觉得呢?

【在 l*****s 的大作中提到】
: 这个不对,while外面还应该有一层循环
avatar
s*s
40
这个最初的ans应该初始化成0吧?

【在 b***i 的大作中提到】
:
: 最优解:
: int findDup(int[] A, int n) {
: int ans = n;

avatar
b*i
41
you are right, I was starting from 1

【在 s*******s 的大作中提到】
: 这个最初的ans应该初始化成0吧?
avatar
b*i
42
not really. Please gives code

【在 s*******r 的大作中提到】
: 对lz的题目不会溢出
: 当数组size大到一定程度而且内存能装的下的话
: 是可能溢出的
: 位操作可以保证不会溢出

avatar
w*o
43

這個能找到duplicates regardless of the range, as long as there's only one
duplicate.
i.e. 1000-2000, given size 1001.
相反,這個就有點欠缺了,需要做一點變形,而且比上面這個慢點,還要考慮overflow。

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
c*p
44
我前2天也被问这个了。
avatar
o*7
45
碰到过一个类似的:
数组只有1-10000,然后size也是10000,因为有一个miss了, 有一个重复了, 怎么找
到miss那个
avatar
u*o
46
这题也好玩,可以用XOR做吗?

【在 o********7 的大作中提到】
: 碰到过一个类似的:
: 数组只有1-10000,然后size也是10000,因为有一个miss了, 有一个重复了, 怎么找
: 到miss那个

avatar
a*e
47
why need "ans ^= i"?

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
s*n
48
这个程序正确是建立在这个等式成立:ans = (0-n)^(0-n)^dup
这个数学上如何证明呢?

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
m*8
49
这是加减两个操作 如果是公式算 只用减一个操作

【在 G****A 的大作中提到】
: 这个小trick不错
avatar
m*8
50
thats it

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
h*p
51
这种看似简单的题有些时候最容易出问题了
avatar
a*u
52
我今天也被面了这道题,我只说了partition的办法,好像比较满意。楼下的办法好牛

【在 c*******r 的大作中提到】
: 数组只有1-10000,然后size是10001,怎么找到重复的那个
: ONSITE题目,让用尽可能多的方法。我能想到的方法是sum之后做减法, Hashtable,
: sorting完扫一边, 或者boolean数组存。
: 当时二逼用了swap的算法不停swap,结果最后自己没弄出来。
: 想问下这题有什么比较好的解法啊?

avatar
s*n
53
XOR有下列性质:
XOR is associative, so (x ^ y) ^ z = x ^ (y ^ z)
XOR is commutative: x ^ y = y ^ x
XOR is its own inverse: x ^ y = 0 if x = y
XOR has zero as an identity: x ^ 0 = x
所以 ans = (0-n)^(0-n)^dup = dup

【在 s******n 的大作中提到】
: 这个程序正确是建立在这个等式成立:ans = (0-n)^(0-n)^dup
: 这个数学上如何证明呢?

avatar
T*u
54
找到m^n和m-n能算出两个来吗?方法比较笨了。

【在 o********7 的大作中提到】
: 碰到过一个类似的:
: 数组只有1-10000,然后size也是10000,因为有一个miss了, 有一个重复了, 怎么找
: 到miss那个

avatar
k*j
55
这题是1-10000
而不是从0开始的,
为什么不是
: ans ^= A[i];
: ans ^= (i+1);
??

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
u*o
56
你好我想和你讨论一下你的办法。如果我没理解错,m是array, n是INDEX,
如果ARRAY里有 0, 1, 2, 3, 3
他们的index是0,1,2,3,4
m^n结果是 3^4 = 000
m-n 结果是3-4=-1.
知道这两个方程怎么求出3是重复的,4是没出现的呢?

【在 T*****u 的大作中提到】
: 找到m^n和m-n能算出两个来吗?方法比较笨了。
avatar
x*0
57
mark
avatar
s*r
58
重复的不止一个吧
avatar
c*e
59
mark

【在 c*******r 的大作中提到】
: 数组只有1-10000,然后size是10001,怎么找到重复的那个
: ONSITE题目,让用尽可能多的方法。我能想到的方法是sum之后做减法, Hashtable,
: sorting完扫一边, 或者boolean数组存。
: 当时二逼用了swap的算法不停swap,结果最后自己没弄出来。
: 想问下这题有什么比较好的解法啊?

avatar
z*e
60
swap
xor
plus
这种题目真心烂大街
avatar
s*n
61

这个没有问题吗?用上面的code跑了一下, 会出问题呀, 还是我的理解有问题。
findDup({0,1,2,2,3})=6;
findDup({0,1,2,3,3}) =7;
e.g.:
For {0,1,2,3,3}, when i =4:
ans = ans^A[4] = ans^3= 0^3=3;
ans = ans^i =3^4=7;

【在 f*******t 的大作中提到】
: 最优解:
: int findDup(int[] A) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= i;
: }
: return ans;
: }

avatar
s*n
62

....., 又试了这个解法,把long改成int了,可是结果也不一样了。
findDup({0,1,2,2,3})=-2;
findDup({0,1,2,3,3}) =-1;
e.g.:
For {0,1,2,3,3},
i=0, ret=0-0=0;
i=1, ret=1-1=0;
i=2, ret=2-2=0;
i=3, ret=3-3=0;
i=4, ret=3-4=-1;
是不是我理解力真有问题了,今天不适合做题了。。。

【在 c*******r 的大作中提到】
: O(n). 一个小bug, i<=n
: int findDup(int []a,int n){
: long ret=0;
: for(int i=0;i: ret+=a[i]-i;
: }
: return ret;
: }

avatar
u*o
63
这题数不能从0开始啊,必须是从1开始,才能保证和下标一个个消掉。
原题是数组只有1-10000,然后size是10001
你的例子的话呢,就是
findDup({1,2,2,3,4})
要用0进数组的话得改一下下标。

【在 s*******n 的大作中提到】
:
: ....., 又试了这个解法,把long改成int了,可是结果也不一样了。
: findDup({0,1,2,2,3})=-2;
: findDup({0,1,2,3,3}) =-1;
: e.g.:
: For {0,1,2,3,3},
: i=0, ret=0-0=0;
: i=1, ret=1-1=0;
: i=2, ret=2-2=0;
: i=3, ret=3-3=0;

avatar
s*n
64

明白了, 两种解法都是这个问题, 不能从0开始。
多谢多谢!!!

【在 u*****o 的大作中提到】
: 这题数不能从0开始啊,必须是从1开始,才能保证和下标一个个消掉。
: 原题是数组只有1-10000,然后size是10001
: 你的例子的话呢,就是
: findDup({1,2,2,3,4})
: 要用0进数组的话得改一下下标。

avatar
p*e
65
应该这样吧
// A[] has (n+1) elements, range: (1...n), only one duplicate
int findDup(int A[], int n) {
int ans = 0;
for (int i = 0; i < n; i++) {
ans ^= A[i];
ans ^= (i+1);
}
ans ^= A[n];
return ans;
}

【在 s*******n 的大作中提到】
:
: 明白了, 两种解法都是这个问题, 不能从0开始。
: 多谢多谢!!!

avatar
s*n
66

我理解的还不够透彻,我trace一下,i+1,好像不对。
{1,1,2,3,4} = 4;
个人觉得要理解上面所提到的, 不要去考虑下标了。
XOR有下列性质:
XOR is associative, so (x ^ y) ^ z = x ^ (y ^ z)
XOR is commutative: x ^ y = y ^ x
XOR is its own inverse: x ^ y = 0 if x = y
XOR has zero as an identity: x ^ 0 = x
所以 ans = (0-n)^(0-n)^dup = dup

【在 p****e 的大作中提到】
: 应该这样吧
: // A[] has (n+1) elements, range: (1...n), only one duplicate
: int findDup(int A[], int n) {
: int ans = 0;
: for (int i = 0; i < n; i++) {
: ans ^= A[i];
: ans ^= (i+1);
: }
: ans ^= A[n];
: return ans;

avatar
L*e
67
I wrote the following methods and ran some testings, it works OK. You need
go through the whole list. In your code, i < n, it never touches the last
element.
/**
* A[] has (n+1) elements, range: (1...n), only one duplicate
* @param a
* @return
*/
public static int findDup(int[] a){
int sum = 0;
for (int i = a.length - 1; i >= 0; i--){
sum += (a[i] - i);
}
return sum;
}
public static int findDup2(int[] a){
int sum = 0;
for (int i = 0; i < a.length; i++){
sum ^= i;
sum ^= a[i];
}
return sum;
}

【在 s*******n 的大作中提到】
:
: 我理解的还不够透彻,我trace一下,i+1,好像不对。
: {1,1,2,3,4} = 4;
: 个人觉得要理解上面所提到的, 不要去考虑下标了。
: XOR有下列性质:
: XOR is associative, so (x ^ y) ^ z = x ^ (y ^ z)
: XOR is commutative: x ^ y = y ^ x
: XOR is its own inverse: x ^ y = 0 if x = y
: XOR has zero as an identity: x ^ 0 = x
: 所以 ans = (0-n)^(0-n)^dup = dup

avatar
x*i
68
a[0]^a[1]^.......a[10000]^10001就可以了吧....
avatar
s*w
69
没见过能解这种两元方程组的方法
可以用 +xi-i 搞一遍得 xdup-xmiss = a
*xi/i 搞一遍得 xdup/xmiss = b
这个两元方程组总会解吧

【在 u*****o 的大作中提到】
: 你好我想和你讨论一下你的办法。如果我没理解错,m是array, n是INDEX,
: 如果ARRAY里有 0, 1, 2, 3, 3
: 他们的index是0,1,2,3,4
: m^n结果是 3^4 = 000
: m-n 结果是3-4=-1.
: 知道这两个方程怎么求出3是重复的,4是没出现的呢?

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。