搜狐笔试:保留最大的数(只能过50%的测试用例)
题目描述
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。
输入描述:
输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 1000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。
输出描述:
输出保留下来的结果。
示例1
输入325
1
输出35
思路:
从头扫描数字325,找到第一个“上升”的数,即 arr[i] < arr[i+1] 。325中第一个“上升”的数为2,2->5,删掉2。然后剩下35,则再次从头扫描,删掉第一个“上升”的数3,最后剩下5。
如果找不到上升的数,说明数字是递减的,诸如54321这样的数,那么每一次就从最后一个数开始删,这样能保证删完的结果是最大的。
然而思路是这个思路,测试用例只能跑到50%。下面是50%的代码。
import java.util.*;
public class Main {
public static String solution(String n, int m) {
StringBuilder sb = new StringBuilder(n);
int len = sb.length();
while(m > 0) {
int index = 0;
boolean flag = true;
for(int i = 0; i < len - 1; i++) {
char c = sb.charAt(i);
char d = sb.charAt(i+1);
if(c < d) {
index = i;
flag = false;
break;
}
}
if(flag) {
while(m > 0) {
sb.deleteCharAt(len-1);
len--;
m--;
}
return sb.toString();
}else {
sb.deleteCharAt(index);
}
m--;
len--;
}
return sb.toString();
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String n = sc.nextLine().trim();
int m = sc.nextInt();
System.out.println(solution(n, m));
}
}
附上大佬们AC的代码,膜拜啊
https://www.nowcoder.com/profile/3656619/codeBookDetail?submissionId=16108171
来源:牛客网 @超蓝の悟空
#include<string>
#include<iostream>
using namespace std;
int main(){
string s;
int len,i;
while(cin>>s>>len){
i=1;
while(len--){
int slen=s.length();
for(i--;i<slen-1;i++)
if(s[i]<s[i+1]){
s.erase(s.begin()+i);
break;
}
if(i==slen-1) s.erase(s.end()-1);
}
cout<<s<<endl;
}
}
注:学渣心里苦,不要学楼主,平时不努力,考试二百五,哭~