算法学习之排序练习

本文深入探讨了数组处理中的多项关键技术,包括寻找排序数组中的和因子、解决TopK问题、确定需要排序的子数组以及构造数组能形成的最小数值。通过具体实例和代码,详细解析了各种算法的实现思路及步骤,为读者提供了丰富的实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 排序数组中找和因子

1、问题

在这里插入图片描述

2、思路

(1)可以从第一个开始,确定两个指针,两层循环进行找,复杂度较高
(2)类似二分查找,两个指针定在左右,定右指针,左指针主键向后移动,左右指针相加
(3) 和<k,左指针向后移动;=k输出,左指针向右移动(不动右指针,可能有两个数相等);>k右指针向左移动

2、需要排序的子数组

1、问题

在这里插入图片描述

2、代码
package com.lanqiao.vidio;

public class SortArray {
	public static void main(String[] args) {
		
	}
	public int[] find(int[] arr,int n)
	{
		int p1 = -1;
		int p2 = -1;
		int max = arr[0];
		for(int i=0;i<n;i++)//从第一个数开始找拐点
		{
			if(i<n-1&&arr[i]>arr[i+1]&&p1==-1)//找到第一个拐点,注意条件
			{
				p1=i;
				if(arr[i]>max)//记录当前波峰最大值,和下一个波做比较
					max = arr[i];
			}
			if(arr[i]<max)//出现第二个波
				p2=i;
		}
		if(p1==-1)//一直没有出现拐点
		{
			return new int[] {0,0};
		}
		return new int[] {p1,p2};
	}
}

3、思路

(1)数组的情况类似于锯齿状,出现波峰或波谷时即出现了要排序的数组
(2)找波峰波谷的方法就是拐点的判断条件中的几点

3、topK问题

1、问题

在一个数组中,输入一些数字,每次输入一个,最终输出结果中最大的几个数字

2、代码
package com.lanqiao.vidio;

import java.util.Scanner;

public class TopK {
	static int k=10;
	
	public static void main(String[] args) {
		int[] arr = {1,3,5,7,9};
		int m;
		Scanner sc = new Scanner(System.in);
		while((m=sc.nextInt())!=-1)
		{
			top(arr,m);
			for(int i:arr)
			{
				System.out.print(i+" ");
			}
		}
	}
	public static void top(int[] arr,int k)
	{
		int min = arr[0];
		int j = 0;
		for(int i = 0;i<arr.length;i++)
		{
			if(arr[i]<min)
			{
				min = arr[i];
				j=i;
			}
		}
		if(k>min)
		{
			arr[j]=k;
		}
	}
}

4、数组能排成的最小数

1、问题

在这里插入图片描述

2、代码
package com.lanqiao.vidio;

import java.util.Arrays;
import java.util.Comparator;

public class MinArray {
	public static void main(String[] args) {
		Integer[] arr = {32,33,321};
		System.out.println(f(arr));
	}
	public static int f(Integer[] arr)
	{
		Arrays.sort(arr,new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				String s1 = o1+""+o2;
				String s2 = o2+""+o1;
				return s1.compareTo(s2);
			}
		});
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<arr.length;i++)
			sb.append(arr[i]);
		return Integer.parseInt(sb.toString());
	}
}

3、思想

(1)修改Sort排序原则根据字符串大小进行比较(思想)
(2)比较排序完成之后使用StringBuilder()进行拼接:StringBuilder可以拼接int类型
(3)拼接完成之后,使用ParseInt方法转换成int类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值