第4天--算法

时间:2021-10-09
本文章向大家介绍第4天--算法,主要包括第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;

}

原文地址:https://www.cnblogs.com/study-Road/p/15386930.html