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();
}
}