1.给定一个数值在1-100的整数数组,请找到其中缺少的数字。

找到丢失的数字 利用byte数组的1或0标记该数字是否被删除,例如byte数组下标为0的数值为1的话,代表数字1存在

public static void findMissNumber1(int[] ints) {

// 声明一个byte数组

byte[] isExist = new byte[100];

for (int i = 0; i < ints.length; i++) {

// 由于数值比下标大1, 0位置其实代表的是数字1

isExist[ints[i] - 1] = 1;

}

for (int i = 0; i < isExist.length; i++) {

if (isExist[i] == 0) {

System.out.println("删除的数字是:" + ++i );

}

}

}

我们可以利用1-100的总和为5050,我们依次减掉数据内的所有值,得到的差值即为删除的值

public static void findMissNumber2(int[] ints) {

int sum = 5050;

for (int i = 0; i < ints.length; i++) {

sum -= ints[i];

}

System.out.println("删除的数字:" + sum);

}

2.从数组中找出给定目标数字的两数组合。例如数组为{2, 3, 5, 7, 8, 9, 11, 14, 18},给定数字给17,那么数组内的3+14=17。

先利用Set存储对应的数字,然后再遍历数组,假设遍历到数字3的时候,检查set中是否存在(17-3)=14这个数字,如果存在的话,即存在这个组合。

public static void findPairNumber(int[] arrays, int target) {

Set existIntegers = new HashSet<>();

for (int i = 0; i < arrays.length; i++) {

existIntegers.add(arrays[i]);

}

for (int i = 0; i < arrays.length; i++) {

if (existIntegers.contains(target - arrays[i])) {

System.out.println("找到对应的数字组合:" + arrays[i] + "和" + (target - arrays[i]));

// 去除掉已使用过的数字

existIntegers.remove(arrays[i]);

}

}

}

3.将数组进行反转。

只需要将数组按中间位置为对称轴进行位置交换即可

public static void reverseArray(int[] arrays) {

for (int i = 0; i < arrays.length/2; i++) {

int tmp = arrays[i];

arrays[i] = arrays[arrays.length -1 - i];

arrays[arrays.length -1 - i] = tmp;

}

}

4.寻找数组中前K个最大的数。

我们新建一个长度为K的数组,遍历原数组,然后将大于K数组内的数字,放进K数组里,然后冒泡淘汰末尾的数字,最后剩下的就是前K个最大的数字。

public static int[] findKMaxInts(int K, int[] ints) {

int[] kInts = new int[K];

for (int i = 0; i < ints.length; i++) {

// 如果大于kInts 数组中的最后一个数字的话,直接插入

if (ints[i] > kInts[K - 1]) {

kInts[K - 1] = ints[i];

}

// 再进行冒泡

bulb(kInts);

}

return kInts;

}

public static void bulb(int[] ints) {

for (int i = ints.length-1; i >= 1; i--) {

// 进行冒泡

if (ints[i] > ints[i - 1]) {

int tmp = ints[i];

ints[i] = ints[i - 1];

ints[i-1]=tmp;

}

}

}

5.求一个数组中连续子向量的最大和

遍历数组,从第一个大于0的数字开始累加,保存最大值,如果累加后的值小于等于0的话,就抛这一下标,从下一个下标开始累积,如果超过之前的最大值的话就进行替换。使用sum和max变量进行操作

public static Integer findMaxSum(int[] ints) {

if (ints.length == 0) {

return null;

}

int currentSum = 0;

int maxSum = 0;

for (int i = 0; i < ints.length; i++) {

currentSum += ints[i];

if (currentSum < 0) {

currentSum = 0;

}

if (currentSum > maxSum) {

maxSum = currentSum;

}

}

return maxSum;

}

6.一个数组中数字都两两重复,只有一个数字没有重复,如何找到那个数字?

我们可以将所有数字进行异或,两两重复的数字,都会被抵消掉,剩余最后的数字就是单个不重复的数字

public static Integer findSingleNumber(int[] ints) {

if (ints.length == 0) {

return null;

}

int singleNumber = ints[0];

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

singleNumber ^= ints[i];

}

return singleNumber;

}

7.将一个二维数组顺时针旋转90度.

先找出旋转90度,下标的变换规律。然后从外圈向内圈递归旋转变换。

public static void rollMatrix90(int[][] matrix, int circle) {

// 当circle为0的时候为最外圈

if (matrix.length - circle * 2 <= 0) {

return;

}

int bound = matrix.length - circle - 1;

for (int i = circle; i < matrix.length - 1 - circle; i++) {

int a = matrix[circle][i];

int b = matrix[i][bound];

int c = matrix[bound][bound - i + circle];

int d = matrix[bound - i + circle][circle];

matrix[circle][i] = d;

matrix[i][bound] = a;

matrix[bound][bound - i + circle] = b;

matrix[bound - i + circle][circle] = c;

}

rollMatrix90(matrix, circle + 1);

}

原数组

1,2,3,4,5,

6,7,8,9,10,

11,12,13,14,15,

16,17,18,19,20,

21,22,23,24,25,

翻转后的数组

21,16,11,6,1,

22,17,12,7,2,

23,18,13,8,3,

24,19,14,9,4,

25,20,15,10,5,

8.找出数组的中位数。

使用快排的思想,但是只往中间位置进行排序,当最后的排序下标抵达数组中间位置的时,就是中位数。

public static int findMiddleNumber(int[] array, int begin, int end) {

int beginRange = begin;

int endRange = end;

if (begin >= end) {

return begin;

}

// 选择begin位置的数字作为分界点

int splitNumber = array[begin];

while (begin + 1 < end) {

if (array[begin + 1] < splitNumber) {

begin++;

continue;

}

if (array[end] > splitNumber) {

end--;

continue;

}

int tmp = array[begin + 1];

array[begin + 1] = array[end];

array[end] = tmp;

}

int tmp = array[beginRange];

array[beginRange] = array[begin];

array[begin] = tmp;

if (begin > array.length / 2) {

return findMiddleNumber(array, beginRange, begin);

} else {

return findMiddleNumber(array, end, endRange);

}

}

9.两个有序数组的合并排序

同时遍历两个数组,每次对比两个数组当前坐标的值哪个小,小的存入新的数组,数组下表往后移一位,大的那边坐标不变,继续下次大小对比。依次循环。

public static int[] mergeSortArray(int[] arrayA, int[] arrayB) {

int[] sortArray = new int[arrayA.length + arrayB.length];

int aIndex = 0;

int bIndex = 0;

for (int i = 0; i < sortArray.length && aIndex <= arrayA.length && bIndex <= arrayB.length; i++) {

if (aIndex == arrayA.length) {

sortArray[i] = arrayB[bIndex++];

continue;

}

if (bIndex == arrayB.length) {

sortArray[i] = arrayA[aIndex++];

continue;

}

if (arrayA[aIndex] < arrayB[bIndex]) {

sortArray[i] = arrayA[aIndex];

aIndex++;

} else {

sortArray[i] = arrayB[bIndex];

bIndex++;

}

}

return sortArray;

}

本文转自我的个人博客:《CoderV的进阶笔记》

欢迎加入Java后端架构技术讨论群:1398880

我的公众号:CoderV的进阶笔记,记录技术心得

java 数组 算法_常见算法总结 - 数组篇相关推荐

  1. 典型的Top K算法_找出一个数组里面前K个最大数

    原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...

  2. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  3. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...

  4. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  5. java常见的排序算法_常见排序算法及Java实现

    先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...

  6. 全排列的java算法_全排列算法原理和实现

    评论 # re: 全排列算法原理和实现  回复  更多评论 #include #include #define CHESSNUM 9 using namespace std; /*********** ...

  7. python常见的排序算法_常见排序算法之python实现

    1. 冒泡排序 时间复杂度为O(n^2), 稳定的排序算法 思路:一开始比较的区间是[0,n-1],依次比较相邻两数,哪个数大哪个数就放在后面,这样一次遍历数组后,最大的数会在数组的最后一个位置,然后 ...

  8. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  9. java调度问题的贪心算法_贪心算法——换酒问题

    知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...

最新文章

  1. Oracle学习之DATAGUARD(七) 使用Broker管理DG
  2. 深度学习核心技术精讲100篇(六十一)-TikTok抖音国际版留存背后的数据和算法推演
  3. Windows 下安装mysql
  4. jQuery.extend与jQuery.fn.extend的区别分析与实例
  5. Asp.net Mvc使用PagedList分页
  6. 开机没有自检声,显示器无信号及各版本BIOS报警信号大全 转
  7. visual studio 高级选项及配置
  8. python之deque
  9. 600分左右的计算机院校,600分左右的985大学 性价比最高的学校
  10. NHibernate剖析:Mapping篇之Mapping-By-Code(2):运用ModelMapper
  11. 短信下发的成功失败概率是多少?如何提高到达率?
  12. 3月盘点众厂商 云计算劳模大奖颁给谁
  13. 关闭 自带日志_再也不是样子货! 丰田86改装日志(3)
  14. 进大厂必备的Java八股文大全(2022最强精简易懂版)
  15. Android 集成高德地图SDK
  16. 【解决】萤石云接入视频报错视频编码类型非H264
  17. 设备中LPC2368芯片个例参数问题导致故障的分析
  18. 如何用思维导图软件绘制组织结构图?
  19. 网络教育计算机统考-多媒体技术操作题
  20. java中单根_java之 单根继承与集合

热门文章

  1. 【Docker】elasticsearch 监控工具 elasticsearch-HQ
  2. Linux : 文件处理命令
  3. 95-260-055-源码-检查点-Savepoint 和 Checkpoint的异同
  4. 【安全】java的Jaas授权与鉴权
  5. ucenter php7.0版,UCenter1.5.0/UCenter Home1.5/Discuz! 7.0
  6. Spring Security Oauth2 之密码模式
  7. 啥?不用安装Jre,SpringBoot项目也可以打包exe应用程序运行!
  8. 如果程序员面试时,大家都说真话会怎么样?画面过于真实....
  9. Java多线程学习四十:如何写一个必然死锁的例子
  10. SQLServer之深度分析跟踪