直接模拟

根据题意依次异或。

  1. class Solution {
  2. public int xorOperation(int n, int start) {
  3. int ans = 0;
  4. for (int i = 0; i < n; ++i){
  5. ans ^= start + i * 2;
  6. }
  7. return ans;
  8. }
  9. }

使用位运算性质

参考:https://leetcode-cn.com/problems/xor-operation-in-an-array/solution/o1-wei-yun-suan-by-bruceyuj/

  1. class Solution {
  2. public int xorOperation(int n, int start) {
  3. // 最后一位
  4. // 如果start是偶数,则最后一位是0
  5. // 如果start是奇数,则最后一位是n个1异或
  6. int lastBit;
  7. if (start % 2 == 0) {
  8. lastBit = 0;
  9. } else {
  10. lastBit = n % 2;
  11. }
  12. // 右移后新序列的结果
  13. int newPart;
  14. // 如果start / 2 是偶数,
  15. // 如果n是偶数,则相当于n / 2 个1异或,
  16. // 如果n是奇数,则相当于n / 2 个1异或,然后再异或上start / 2 + n - 1
  17. if ((start / 2) % 2 == 0) {
  18. newPart = (n / 2) % 2;
  19. if (n % 2 == 1) {
  20. newPart ^= start / 2 + n - 1;
  21. }
  22. } else {
  23. // 如果start / 2 是奇数,则取出第一项start / 2,剩下的相当于start / 2 是偶数的情况
  24. newPart = ((n - 1) / 2) % 2;
  25. if ((n - 1) % 2 == 1) {
  26. newPart ^= start / 2 + n - 1;
  27. }
  28. newPart ^= start / 2;
  29. }
  30. return (newPart << 1) + lastBit;
  31. }
  32. }