算法笔记-第02节课

第02节课

1. 安位异或交换两个数

如何不用额外变量交换两个数

代码展示:

static void swap(int[] arr, int i, int j) {
  if(arr == null || arr.length < 2 || i == j) return;
  arr[i] = arr[i]^arr[j];
  arr[j] = arr[i]^arr[j];
  arr[i] = arr[i]^arr[j];
}

2. 找出数组中唯一出现奇数次的数

一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数

思路:

将数组中的所有数字异或,出现了偶数次的元素全部被异或调,剩下唯一的一个出现了奇数次的元素

代码展示:

static int printOddTimesNum1(int[] arr) {
  int eor = 0;
  for (int x : arr) {
    eor ^= x;
  }
  return eor;
}

3. 提取整数最右侧的1

怎么把一个int类型的数,提取出最右侧的1来

思路:

一个数在Java中表示方法为补码,正数的补码为自己,负数的补码为反码+1,一个数按位与上自己的镜像数可以得到右侧的1的正数

代码展示:

static int rightOne(int x) {
  return x & (-x)
}

4. 找出数组中出现奇数次的两个数(其他数都是偶数次)

一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数

思路:

  1. 首先把所有的数按位异或,最终得到的数x只是两个出现奇数次的数的异或结果
  2. 找到结果数x的最右非0位置的数y,用这个数y来区分原来的两个数
  3. 用数y可以把原数组分离成两个数组,每一个数组中只会出现一个出现奇数次的数

代码展示:

static int[] printOddTimesNum2(int[] arr) {
  if(arr == null && arr.length < 2) {
    return new int[]{-1, -1};
  }
  int tmp = 0;
  for(int ele: arr) {
    tmp ^= ele;
  }
  int rightOne = tmp & (-tmp);
  int onlyOne = 0;
  for(int ele: arr) {
    if((ele & rightOne) != 0) {
      onlyOne ^= ele;
    }
  }
  
  return new int[] {onlyOne, tmp ^ onlyOne}

}

5. 数组中其他数都是出现了M次,找出唯一出现了K次的数

一个数组中有一种数出现K次,其他数都出现了M次,M>1K<M。找到,出现了K次的数,要求,额外空间复杂度O(1),时间复杂度O(N)

思路:

对于一个整数,计算机使用32bit表示,整数使用补码表示为32位bit位
如果将每一个整数的32个bit位分别累加,出现了M次的数,对应的二进制位和一定能别M整除,而出现了K次的则不能,因为有条件K<M限制

代码展示:

static int kmNormal(int[] arr, int k, int m) {
  if (arr == null || arr.length < k) {
    return -1;
  }

  Map<Integer, Integer> map = new HashMap<>();
  for (int element : arr) {
    if (map.containsKey(element)) {
      map.put(element, map.get(element) + 1);
    } else {
      map.put(element, 1);
    }
  }

  for (Integer key : map.keySet()) {
    if (map.get(key) == k) {
      return key;
    }
  }
  return -1;
}

public static int onlyKTimes(int[] arr, int k, int m) {
  if(arr == null || arr.length == 0) return -1;

  int[] cells = new int[32];
  for(int i = 0; i < arr.length; i++) {
    for(int j = 0; j < 32; j++) {
      cells[j] += (arr[i] >> j);
    }
  }
  int ans = 0;
  for(int i = 0; i < 32; i++) {
    if(cells[i]%m != 0) {
      if(cells[i]%m == k) {
        ans |= (1 << i);
      } else {
        return -1;
      }
    }
  }

  if(ans == 0) {
    int count = 0;
    for(int i = 0; i < arr.length; i++) {
      if(arr[i] == 0) {
        count++;
      }
    }
    if (count != k) {
      return -1;
    }
  }
  return ans;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MIT(麻省理工学院)的线性代公开课非常详细和全面,这门课程是由麻省理工学院的教授Gilbert Strang主讲的。课程内容涵盖了线性代的基本概念和应用,将线性代的理论与实践相结合。 这门课程的笔记非常详细,内容包括了课堂讲义、示例问题的详细解析、证明过程和习题答案等等。课程的整个结构非常清晰,从基础的向量、矩阵和行列式开始讲解,逐渐深入到线性方程组、特征值和特征向量、相似矩阵等内容。 在笔记中,每个概念和理论都会进行详细的解释和证明,帮助学生更好地理解和掌握相关知识。同时,笔记还提供了丰富的示例和习题,让学生通过实际的问题来巩固和应用所学知识。 另外,笔记中还有大量的图表、图示和实例来帮助学生直观地理解和记忆各种概念和算法。特别是对于抽象的概念,通过图形化的解释可以更好地帮助学生理解。 总之,MIT的线性代公开课的笔记内容非常详细和全面,适合对线性代感兴趣的学生参考。无论是作为学习线性代的资料,还是作为复习和巩固知识的辅助材料,这些笔记都是非常有价值的资源。无论是在理论还是应用层面,学生都能够通过这些笔记全面地掌握线性代的知识。 ### 回答2: MIT线性代公开课是由麻省理工学院开设的一门线性代课程,涵盖了从基础概念到高阶技巧的全方位学习内容。下面是对该课程的笔记总结: 该课程由吉尔伯特•斯特朗(Gilbert Strang)教授主讲,他是一位著名的学家和教育家,为学生提供了一种简单而深入的学习方法。 该课程共分为26节课,每节课都有对应的讲义和视频,以及一些习题和作业,使学生能够更好地掌握课程内容。 课程首先介绍了向量和矩阵的基础知识,讲解了向量的加法、减法和乘运算,以及矩阵的加法、减法和乘法运算,并且讲解了这些运算的几何意义。然后,课程进一步探讨了线性方程组的求解方法,包括高斯消元法和矩阵的逆运算。这些内容为后续课程奠定了基础。 接下来,课程介绍了行列式和特征值的概念,并讲解了如何计算行列式和求解特征值和特征向量。特征值和特征向量在矩阵的变换中起着重要的作用,因此对于理解线性代的应用非常重要。 随后,课程进一步深入探讨了线性变换、正交性和投影等概念,以及特殊矩阵的性质,如对称矩阵和正定矩阵。这些内容使学生能够更好地理解线性代在实际应用中的重要性。 最后,课程介绍了一些高级线性代的内容,如奇异值分解和特殊矩阵的标准形式。这些内容对于研究生和专业领域的学生尤为重要。 总的来说,MIT线性代公开课提供了一套完整、系统的线性代学习资源,不仅适用于初学者,还可以帮助已经具备一定线性代基础的学生深入学习。课程中的讲义和视频内容清晰明了,配有大量实例和习题,以及讲解中的实时演算,确保学生能够深入理解和掌握线性代的核心概念和技巧。无论是在学术研究还是职业发展中,这门课程都具有重要的参考价值。 ### 回答3: 麻省理工学院(MIT)的线性代公开课是一门非常出色的公开课,内容十分详细并且完整。以下是对该公开课的超详细笔记。 该公开课以线性代为主题,通过教授线性代的基本概念、理论和应用,帮助学生建立起对线性代的深入理解和应用能力。 课程从基本概念讲起,首先介绍了向量和矩阵的定义、性质和操作。然后深入讲解了线性方程组的解法,包括高斯消元法和矩阵的行列式。接下来,课程探讨了向量空间和矩阵空间的性质及其应用,如子空间、基、维等概念。进一步,课程讲解了线性变换和特征值、特征向量的概念及其重要性。 在讲解了线性代的基本理论后,课程引入了矩阵分解和特殊矩阵的概念,如LU分解、QR分解和特征值分解等。随后,课程介绍了正交向量、正交矩阵和正交变换的概念及其在几何变换、信号处理等领域的应用。 此外,课程还涉及了线性代在图论、最小二乘问题、据压缩等领域的应用。通过实例和案例分析,课程帮助学生将线性代的理论知识与实际问题相结合,提高解决实际问题的能力。 值得一提的是,该公开课还通过演示和实验的方式,让学生亲自动手进行线性代的计算和应用,培养了学生的实践能力和创造力。 总的来说,麻省理工学院的线性代公开课以其详细的内容和完整的知识体系,在教授线性代知识和培养学生的应用能力方面取得了优异的成绩。无论是对于想要深入学习线性代的学生,还是对于希望提高问题解决能力的人群,这门公开课都是非常推荐的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值