nyoj 448 寻找最大数、最小数

nyoj 448 寻找最大数、最小数

java代码及思路


import java.util.Random;
import java.util.Stack;
/**
*2017年12月19日  下午8:28:03<br>
*TODO:<pre><br>  给定N个数字删除其中M个使剩下的数按原来的顺序组成最大最小  </pre>
    Question:<pre><br>    </pre>
    Analysis:<pre><br>    </pre>
*/
public class 删除组成最大最小
{
    /**
     *  TODO:<pre>
     *  @param args
     *  void:
     */
    public static void main(String[] args)
    {
        Random r = new Random();
        int i = 5;
        while(i-->0)
        {
            int num = r.nextInt(1000000)+10000;
            max1((num+"").toCharArray(),3);
            max2((num+"").toCharArray(),3);
        }
    }

    /**
     *  TODO:<pre>最大数
     *  寻找升序区间,如果找到,删除第一个升序区间第一个数字;如果找不到升序区间,删除最后一个数字

     *  @param str 数字
     *  @param m
     *  void:
     */
    public static void max1(char[] arr,int m)
    {
        Stack<Character> stack = new Stack<Character>();//用栈存储数据,方便删除,比较
        if( m>=arr.length ) return;
        for(int i = 0;i<arr.length;i++)
            stack.add(arr[i]);
        //
        for(int i = 0;i<m;i++)
        {
            int r = 0;
            boolean flag = false;//标志变量,是否找到升序区间
            for(int size = stack.size()-1;r<size;r++)
            {
                if( stack.get(r)<stack.get(r+1) )
                {
                    flag = true;
                    break;
                }
            }
            if( flag ) stack.remove(r); //有升序,删除指定数字
            else stack.pop();//无升序,删除最后一个数字
        }
        System.out.print(new String(arr)+"  ");
        for(int a = 0,b = stack.size();a<b;a++)
            System.out.print(stack.get(a));
        System.out.println();
    }

    /**
     *  TODO:<pre>最大数
     *  转换问题,将问题转换为在N个数字中寻找N-M个数字使组成的新数最大
     *  那么,寻找N-M 次
     *  第一次在(1,M+1)中寻找第一个最大数,下标i;N个数字中M+1 后面剩下 N-1-M个数字,还需要找 N-M-1个最大的数
     *  第二次,在第一次找到最大数的后面(i+1,M+2)继续找最大的数
     *  @param arr
     *  @param m
     *  void:
     */
    public static void max2(char[] arr,int m)
    {
        int n = arr.length;
        if( n<=m ) return;
        int[] ans = new int[n-m];
        int j,max = -1,index = -1;
        for(int i = 0;i<n-m;i++) // 寻找n-m 轮
        {
            max = -1;
            for(j = index+1;j<m+1+i;j++)// 在上一次找到的的最大数的后面继续找
            {
                if( arr[j]-'0'>max )
                {
                    max = arr[j]-'0';
                    index = j;
                }
            }
            ans[i] = index;
        }
        for(int i = 0;i<n-m;i++)
        {
            System.out.print(arr[ans[i]]);
        }
        System.out.println();
    }

    /**
     *  TODO:<pre>最小数
     *  寻找降序区间,删除第一个降序区间第一个数字
     *  (如果待删除的数字为第一个且后面是0,则寻找下一个降序区间),
     *  如果找不到降序区间,删除最后一个数字
     *  @param str
     *  @param m
     *  void:
     */
    public static void min(char[] arr,int m)
    {
        Stack<Character> stack = new Stack<Character>();
        if( m>=arr.length ) return;
        for(int i = 0;i<arr.length;i++)
            stack.add(arr[i]);
        //
        for(int i = 0;i<m;i++)
        {
            int j = 0;
            boolean flag = false;//标志变量,是否找到降序区间
            for(int size = stack.size()-1;j<size;j++)
            {
                if( stack.get(j)>stack.get(j+1) )
                {
                    if( j==0&&stack.size()>1&&stack.get(1)=='0' ) continue;
                    flag = true;
                    break;
                }
            }
            if( flag )
            {
                stack.remove(j);
            } else stack.pop();
        }
        System.out.print(new String(arr)+"  ");
        for(int a = 0,b = stack.size();a<b;a++)
            System.out.print(stack.get(a));
        System.out.println();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值