数组问题

1 篇文章 0 订阅

1.输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

import java.util.ArrayList;
public class Solution {
    public void reOrderArray(int [] array) {
        //(1)方法一 冒泡交换
        /*for(int i=0;i<array.length;i++){
            for(int j=array.length-1;j>i;j--){
                if(array[j]%2!=0&&array[j-1]%2==0){
                    int temp=0;
                    temp=array[j];
                    array[j]=array[j-1];
                    array[j-1]=temp;
                }
            }
        }*/
        //方法(2)新建集合
        ArrayList<Integer> list=new ArrayList<>();
        ArrayList<Integer> list2=new ArrayList<>();
        for(int i=0;i<array.length;i++){
            if(array[i]%2==0){
                list.add(array[i]);
            }else{//存奇数
                list2.add(array[i]);
            }
        }
        for(int i=0;i<list2.size();i++){
            array[i]=list2.get(i);
        }
        for(int i=0;i<list.size();i++){
            array[i+list2.size()]=list.get(i);
        }
    }
}

2.{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和
分析:有可能不是从第一个元素开始计算,所以第二种解法存在双层的for循环

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        //第一种:单纯数组判别相加条件:元素正负
        if(array.length==0||array==null){
            return 0;
        }
        int []sum=new int [array.length];
        sum[0]=array[0];
        //判断是否相加
        for(int i=1;i<array.length;i++){
            sum[i] = (sum[i-1]<0?array[i]:sum[i-1]+array[i]);
        }
        int max=sum[0];
        for(int j=1;j<sum.length;j++){
            if(sum[j]>max){
                max=sum[j];
            }
        }
        return max;
        
        //第二种方法
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<array.length;i++){
            int sum=0;//每次循环都要归0
            for(int j=i;j<array.length;j++){
                sum=sum+array[j];
                list.add(sum);
            }
        }
        if(list.size()==0){
            return 0;
        }
        Collections.sort(list);
        return list.get(list.size()-1);
    }
}

3.把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<=0) return 0;
        int [] arr=new int[index];
        int a2=0;
        int a3=0;
        int a5=0;
        arr[0]=1;
        int count=0;//计数
        int temp=0;//用来保存最小值
        while(count<index-1){
            //第一个数存在0索引  第index个存在index-1上
            temp=min(arr[a2]*2,arr[a3]*3,arr[a5]*5);
            if(temp==arr[a2]*2){a2++;}
            if(temp==arr[a3]*3){a3++;}
            if(temp==arr[a5]*5){a5++;}
            count++;
            arr[count]=temp;
        }
        return arr[index-1];
    }
    public int min(int a, int b, int c) {
        int temp = (a < b) ? a : b ;
        return temp < c ? temp : c ;
        }
}

4.在这里插入图片描述

public boolean isContinuous(int [] numbers) {
        if(numbers.length<5){//排数小于5张肯定不是顺子
            return false;
        }
        //先排序
        Arrays.sort(numbers);
        //计算癞子数量
        int count=0;
        for(int i=0;i<numbers.length;i++){
            if(numbers[i]==0) {
                count++;
            }
        }
        //用癞子填补两个数字之间的差值
        for(int i=count;i<numbers.length-1;i++){
            //出现相同的数字肯定不是顺子
            if(numbers[i]==numbers[i+1]){
                return false;
            }
            //3和2之间不差数字   3-2-1
            count=count-(numbers[i+1]-numbers[i]-1);
        }
        if(count>=0){return true;}
        else{return false;}
    }

5.在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
分析:对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。本题要求找出重复的数字,因此在调整过程中,如果第 i 位置上已经有一个值为 i 的元素,就可以知道 i 值重复

public boolean duplicate(int numbers[],int length,int [] duplication) {
        if(numbers==null||length<=0){
            return false;
        }
        for (int i = 0; i < length; i++) {
            while (numbers[i]!=i){
                if(numbers[i]==numbers[numbers[i]]){
                    duplication[0]=numbers[i];
                    return true;
                }
                swap(numbers,i,numbers[i]);
            }
        }
        return false;
    }
    public static void swap(int []num,int a,int b){
        int temp=num[a];
        num[a]=num[b];
        num[b]=temp;
    }

6.给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)

public int[] multiply(int[] A) {
    int n = A.length;
    int[] B = new int[n];
    for (int i = 0, product = 1; i < n; product *= A[i], i++)       /* 从左往右累乘 */
        B[i] = product;
    for (int i = n - 1, product = 1; i >= 0; product *= A[i], i--)  /* 从右往左累乘 */
        B[i] *= product;
    return B;

7.给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
滑动窗口

 public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        //判断不成立的情况
        if(num==null||size<0){
            return null;
        }
        ArrayList<Integer> list=new ArrayList<>();
        if(size==0){
            return list;
        }
        if(num.length<size){
            return list;
        }else{
            for(int i=0;i<num.length-size+1;i++){
                //每个i值对应着一个区间 把这个区间放在一个集合中 
                ArrayList<Integer> temp=new ArrayList<>();
                for(int j=i;j<i+size;j++){
                    temp.add(num[j]);
                }
                //在每个集合中排序 选出最大的 添加到最终的list集合中
                Collections.sort(temp);//默认升序
                list.add(temp.get(temp.size()-1));
            }
        }
        return list;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值