搜狐2015面试题-整数m去掉n位后剩下最大值

mengni123321 2015-09-18 02:52:23
搜狐2015面试题-整数m去掉n位后剩下最大值。
给定一个整数m,要求给出一个算法去掉n位后剩余最大值。
例如:
1,m=51342 n= 1;则结果是应该是去掉数字1,剩余最大值5342
2,m=51342 n= 2;则结果是应该是去掉数字1,2,剩余最大值534。、
函数定义:
int maxValue(int n,int m)
{
}
...全文
1950 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
不会再变le 2015-10-14
  • 打赏
  • 举报
回复
这个简单,第一趟去1,第二趟去2,直到去得数字个数等于要求的就行了
不会再变le 2015-10-14
  • 打赏
  • 举报
回复
引用 39 楼 a419635259 的回复:
这个简单,第一趟去1,第二趟去2,直到去得数字个数等于要求的就行了
最后结果,时间复杂度On,空间复杂度O1 应该是最省的了
Dark_start 2015-10-13
  • 打赏
  • 举报
回复
引用 13 楼 Ango_ 的回复:
我来给出一个最方便的算法,把问题转化成另外一个问题:从整数m中取出k位组成最大的数是什么?
解法:
把整数转为字符串,长度为len,先取第一位,可以取最左边k个中的最大值作为第一位,然后在最大值右边的数中取出k-1位组成的最大数(递归过程)

理解了一下这个,实际就是把本来题目中的“去除n位”也就是留下“m-n”位这个值用“k”替代,更换题目说明吧?
悲催的老菜农 2015-09-30
  • 打赏
  • 举报
回复
没太明白题目的意思啊 你把数字换成字符串,去掉要去的,然后对字符串排序,你看符合你的要求吗?
__孤剑__独舞 2015-09-29
  • 打赏
  • 举报
回复
或者直接暴力解决,从m位中,挑出m-n个数,就行,但是跳的时候按照顺序就行,不是随意挑,就行,时间复杂度O(n*n)
__孤剑__独舞 2015-09-29
  • 打赏
  • 举报
回复
很简单,譬如51342,删去两个数字,最后只剩下三位数,那么这个三位数的最高位,可选区间位为[1,3] ,也就是原数字的,5,1,3这三个数字,为什么不能是,4和2,?因为是三位数字,所以最高位,必须在4的左边中选出一个来,不然位数不够,如果选4为最高位,那么后面就没有你可选的数字了,所以基于这个道理,很容易就能找到某一个位置上应该选谁了。 其实最终问题转化为,找某个区间上的最大值。
  • 打赏
  • 举报
回复
条件:你去除的数要比左右的数都要小 行为:从左边开始
糖果_ 2015-09-28
  • 打赏
  • 举报
回复
引用 32 楼 jueyue 的回复:
永远找最大的数据就可以找到了
public static int maxValue(int n, int m) {
		String temp = m + "";
		// 屏蔽异常问题
		if (n >= temp.length()) {
			return 0;
		}
		// 只剩一个,查询到最大值就可以了
		char[] charArr = temp.toCharArray();
		Arrays.sort(charArr);
		if (n == temp.length() - 1) {
			return charArr[temp.length() - 1] - 48;
		}
		// 开始正常排序,List 方便删除
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < charArr.length; i++) {
			list.add("" + charArr[i]);
		}
		int deleteNums = 0;
		StringBuilder lessStr = new StringBuilder();
		while (deleteNums < n) {
			for (int i = list.size() - 1; i >= 0; i--) {
				// 发现最大的数据是在那个位置,判断这个数据前面的数据是不是可以删除
				int maxIndex = temp.indexOf(list.get(i));
				if (maxIndex <= n - deleteNums) {
					lessStr.append(temp.charAt(maxIndex));
					temp = temp.substring(maxIndex + 1);
					deleteNums += maxIndex;
					list.remove(i);
					break;
				}
			}
		}

		return Integer.valueOf(new String(lessStr.append(temp)));
	}

maxValue(2,9890);这种数据就会报错
沪php攻城师 2015-09-25
  • 打赏
  • 举报
回复
我的算法是,每次都从前n*2位的数字中找出最小的删除,然后n-1后继续,直到n=0为止,剩下的就是最大数。 以下是PHP代码:

function maxValue($n,$m)
{
    $m = (string)$m;
    for($i=$n;$i>0;$i--)
    {
        $t = min($i*2,strlen($m));
        for($j=1,$k=0;$j<$t;$j++)
        {
            $t1 = $m{$k};
            $t2 = $m{$j};
            if($t1 > $t2)
            {
                $k = $j;
            }
        }
        $tmp = substr($m,0,$k).substr($m,$k+1);
        $m = $tmp;
    }
    return $m;
}
echo maxValue(1,51342);
echo "<br>";
echo maxValue(2,51342);
echo "<br>";
echo maxValue(2,731518);
echo "<br>";
echo maxValue(3,731518);
echo "<br>";
echo maxValue(4,731518);
最后结果为: 5342 542 7518 758 78
糖果_ 2015-09-25
  • 打赏
  • 举报
回复
引用 5 楼 daydreary 的回复:
可能有错,没测太多

private static void maxValue(int n, int m) {
		String s = m + "";
		char c;
		int index;
		if (n >= s.length()) {
			System.out.println("error");
			return;
		}
		for (int i = 0; i < n; i++) {
			index = 0;
			c = s.charAt(index);
			for (int j = 0; j < s.length(); j++) {
				if ((c - '0') > (s.charAt(j) - '0')) {
					c = s.charAt(j);
					index = j;
				}
			}
			s = s.substring(0, index) + s.substring(index + 1, s.length());
		}
		System.out.println(s);
	}
改造一下就可以了啊 private static void maxValue(int n, int m) { String s = m + ""; char c; int index; if (n >= s.length()) { System.out.println("error"); return; } for (int i = 0; i < n; i++) { index = 0; c = s.charAt(index); for (int j = 1; j < s.length(); j++) { if(i==n-1){ if ((s.charAt(j-1) - '0') < (s.charAt(j) - '0')) { c = s.charAt(j); index = j-1; } }else{ if ((c - '0') > (s.charAt(j) - '0')) { c = s.charAt(j); index = j; } } } s = s.substring(0, index) + s.substring(index + 1, s.length()); } System.out.println(s); }
希咚的故事 2015-09-25
  • 打赏
  • 举报
回复
永远找最大的数据就可以找到了
public static int maxValue(int n, int m) {
		String temp = m + "";
		// 屏蔽异常问题
		if (n >= temp.length()) {
			return 0;
		}
		// 只剩一个,查询到最大值就可以了
		char[] charArr = temp.toCharArray();
		Arrays.sort(charArr);
		if (n == temp.length() - 1) {
			return charArr[temp.length() - 1] - 48;
		}
		// 开始正常排序,List 方便删除
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < charArr.length; i++) {
			list.add("" + charArr[i]);
		}
		int deleteNums = 0;
		StringBuilder lessStr = new StringBuilder();
		while (deleteNums < n) {
			for (int i = list.size() - 1; i >= 0; i--) {
				// 发现最大的数据是在那个位置,判断这个数据前面的数据是不是可以删除
				int maxIndex = temp.indexOf(list.get(i));
				if (maxIndex <= n - deleteNums) {
					lessStr.append(temp.charAt(maxIndex));
					temp = temp.substring(maxIndex + 1);
					deleteNums += maxIndex;
					list.remove(i);
					break;
				}
			}
		}

		return Integer.valueOf(new String(lessStr.append(temp)));
	}
糖果_ 2015-09-25
  • 打赏
  • 举报
回复
用递归处理,希望各位看哈有什么问题,上面发布的两个都不准确

private static String maxValue(int n, String m) {
		if(n==0||n>=m.length()){
			return "";
		}
	    char c = m.charAt(0);
	    int index = 0;
		for (int j = 1; j < m.length(); j++) {
			if ((c - '0') < (m.charAt(j) - '0')) {
				c = m.charAt(j);
				index = j;
			}
	    }
		if(index>n){
			m = maxValue(n,m.substring(0,index))+m.substring(index,m.length());
		}else if(index<n){
			m = m.substring(index,index+1)+maxValue(n-index,m.substring(index+1, m.length()));
		}else{
			 m = m.substring(index,m.length());
		}
        return m;
    }
沪php攻城师 2015-09-25
  • 打赏
  • 举报
回复
我前面的计算错误了,不是找出最小的,而是找出前n个中最大的来处理,基本逻辑就是每次找出前n个中最大的数字,然后减去该数字前被抛弃的数字数目得到新的n后,在重复直到剩余数字数目等于需要得到的结果的长度为止。

function maxValue($n,$m)
{
    echo "n=$n,m=$m : ";
    $m = (string)$m;
    $len = strlen($m) - $n;//结果字符串长度
    $str = "";
    for($i=$n;$i>0;)
    {
        for($j=1,$k=0;$j<=$i;$j++)
        {
            $t1 = $m{$k};
            $t2 = $m{$j};
            if($t1 < $t2)
            {//找出前N个中最大数字位置
                $k = $j; 
            }
        }
        $str .= $m{$k};
        if(strlen($str) == $len)return $str;
        $i = $i - $k;
        $m = substr($m,$k+1);
    }
    $str .= $m;
    return $str;
}
echo maxValue(1,51342);
echo "<br>";
echo maxValue(2,51342);
echo "<br>";
echo maxValue(1,731518);
echo "<br>";
echo maxValue(3,731518);
echo "<br>";
echo maxValue(4,731518);
echo "<br>";
echo maxValue(1,654321);
echo "<br>";
echo maxValue(2,123456);
echo "<br>";
echo maxValue(1,425161);
echo "<br>";
echo maxValue(2,425161);
echo "<br>";
echo maxValue(3,425161);
echo "<br>";
echo maxValue(4,425161);
echo "<br>";
echo maxValue(5,425161);
n=1,m=51342 : 5342 n=2,m=51342 : 542 n=1,m=731518 : 73518 n=3,m=731518 : 758 n=4,m=731518 : 78 n=1,m=654321 : 65432 n=2,m=123456 : 3456 n=1,m=425161 : 45161 n=2,m=425161 : 5161 n=3,m=425161 : 561 n=4,m=425161 : 61 n=5,m=425161 : 6
糖果_ 2015-09-25
  • 打赏
  • 举报
回复
private static void maxValue(int n, int m) {
        String s = m + "";
        char c;
        int index;
        if (n >= s.length()) {
            System.out.println("error");
            return;
        }
        for (int i = 0; i < n; i++) {
            index = 0;
            c = s.charAt(index);
            for (int j = 1; j < s.length(); j++) {
            	if(i==n-1){
            		if ((s.charAt(j-1) - '0') < (s.charAt(j) - '0')) {
            			c = s.charAt(j);
            			index = j-1;
            			break;
            		}
            	}else{
            		if ((c - '0') > (s.charAt(j) - '0')) {
            			c = s.charAt(j);
            			index = j;
            		}
            	}
            }
            s = s.substring(0, index) + s.substring(index + 1, s.length());
        }
        System.out.println(s);
    }
qq_25814381 2015-09-24
  • 打赏
  • 举报
回复
引用 20 楼 Itsjd 的回复:
最简单的思路: 保证最高位的数字是最大的,依次类推,每个高位的数字都至少大于等于它前面的数字,循环到最后一位的时候,把最后一位删除(如果前面已经满足条件删除了一位,就break开始下一次循环)
我觉得算法这种东西你们说的太多了,没什么意义的 比如你的意思:1.使用直接选择排序,找到最小的那个数字,删除掉 2.循环n此进行操作1 while(n--) { 直接选择最小数字,删除; }
DY1201 2015-09-24
  • 打赏
  • 举报
回复
最简单的思路: 保证最高位的数字是最大的,依次类推,每个高位的数字都至少大于等于它前面的数字,循环到最后一位的时候,把最后一位删除(如果前面已经满足条件删除了一位,就break开始下一次循环)
DY1201 2015-09-24
  • 打赏
  • 举报
回复
引用 18 楼 qq_25814381 的回复:
我觉得思路应该是这样: 1.将原数字分割成每个0-9的数字放入数组中(递归,保留顺序) 2.根据要删除的个数n,找到数组中比较小的n个数字 3.在数组中删除这n个数字,然后将剩余的数字重新组合
看一下十楼
qq_25814381 2015-09-24
  • 打赏
  • 举报
回复
我觉得思路应该是这样: 1.将原数字分割成每个0-9的数字放入数组中(递归,保留顺序) 2.根据要删除的个数n,找到数组中比较小的n个数字 3.在数组中删除这n个数字,然后将剩余的数字重新组合
DY1201 2015-09-24
  • 打赏
  • 举报
回复

最简单的思路,只为求分!!!!!
public static void getMaxNum(int m,int n){
		StringBuffer sb = new StringBuffer();
		sb.append(m);
		for(int j=0;j<n;j++){
			for(int i=0;i<sb.length();i++){
				if(i==sb.length()-1){
					sb.deleteCharAt(i);
					break;
				}
				if(sb.charAt(i)<sb.charAt(i+1)){
					sb.deleteCharAt(i);
					break;
				}
			}
		}
		System.out.println(sb.toString());
	} 
Zhangjq1014 2015-09-24
  • 打赏
  • 举报
回复
比如说 718132 删除两位 第一步:删除第一个1 剩下78132最大 递归下一步:(78132删除一位留最大) 也就是删除第二个1 剩下7832最大 这样问题简化了
加载更多回复(20)

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧