我想知道为什么我运行这段代码时没有错误,尤其是这一行
ret[(int) b[i]] = p;
。其实这个解决方案是我在leetcode竞赛387中找到的,排名第3的用户。
public int[] shrink(int[] a) {
int n = a.length;
long[] b = new long[n];
for (int i = 0; i < n; i++) b[i] = (long) a[i] << 32 | i;
Arrays.sort(b);
int[] ret = new int[n];
int p = 0;
for (int i = 0; i < n; i++) {
if (i > 0 && (b[i] ^ b[i - 1]) >> 32 != 0) p++;
ret[(int) b[i]] = p;
}
return ret;
}
解释一下这一行
ret[(int) b[i]] = p;
为什么没有溢出。
有符号整数到整型 T 的窄化转换会简单地丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。
该方法使用 long 来表示两个整数,并将
long
转换为 int
将检索最低有效 32 位(这是原始数组中的索引)。投射不会导致溢出。