第4天--算法

1.选择排序

public void selectSort(int arr[]) {

  if(arr == null || arr.length < 2){

    return;

  }

  for(int i = 0;i < arr.length - 1;i ++) {

    int minIndex = i;

    for(int j = i + 1;j < arr.length;j ++) {

      minIndex = arr[j] < arr[minIndex] ? j : minIndex;

    }

    swap(arr,i,minIndex);

  }

}

public void swap(int arr[],int i,int j){

  int temp = arr[i];

  arr[i] = arr[j];

  arr[j] = temp;

}

 

2.插入排序

public void insertSort(int arr[]) {

  for(int i = 1;i < arr.length;i ++) {

    for(int j = i - 1;j >= 0 && arr[j] > arr[j + 1];j --) {

      swap(arr,j,j + 1);

    }

  }

}

public void swap(int arr[],int i,int j) {

  int temp = arr[i];

  arr[i] = arr[j];

  arr[j] = temp;

}

3.一个数组中只有一种数出现了奇数次,剩下的数都出现了偶数次

public int method1(int arr[]) {

  int res = 0;

  for(int i:arr){

    res ^= i;

  }

  return res;

}

4.一个数组中有两个数出现了奇数次,剩下的都出现了偶数次

public int[] method(int arr[]) {

  int res[] = new int[2];

  int res0 = 0;

  for(int i:arr) {

    res0 ^= i;

  }

  int rightOne = res0 & (-res0);  //a&(-a)可以获得最右边的1

  int res1 = 0;

  for(int i:arr) {

    if((i & rightOne) == 0) {

      res1 ^= i;

    }

  }

  res0 = res0 ^ res1;

  res[0] = res0;

  res[1] = res1;

  return res;

}

5.一个数组中只有一种数出现了m次,剩下的数都出现了n次(n > 1 && n > m)

public int method(int arr[],int m,int n) {

  int temp[] = new int[32];

  for(int i : arr) {

    for(int j = 0;j < 32;j ++) {

      if((i & (1 << j)) != 0) {

        temp[j] ++;

      }

    }

  }

  int res = 0;

  for(int i = 0;i < 32;i ++) {

    if(temp[i] % n != 0) {

      res = res | (1 << i);

    }

  }

  return res;

}

posted @ 2021-10-09 17:40  现在开始努力  阅读(26)  评论(0)    收藏  举报