• 最大数


    给定一个整数,从整数当中去掉k个数字,要求剩下数字形成的新整数尽可能小。

    什么意思呢?让我们举几个栗子:

    给定整数1593212,删去3个数字,新整数的最小情况是1212

    给定整数30200,删去1个数字,新整数的最小情况是200

    给定整数10,删去2个数字,新整数的最小情况是0

    需要注意的是,给定的整数大小可以超过long类型的范围,所以需要用字符串来表示。

    给定整数 541270936,要求删去一个数,让剩下的整数尽可能小。

    此时,无论删除哪一个数字,最后的结果都是从9位整数变成8位整数。既然同样是8位整数,我们显然应该优先把高位的数字降低,这样对新整数的值影响最大。

    JAVA:

    import java.io.*;
    import java.util.*;
    
    class test  
    {
        public static void main (String[] args) throws java.lang.Exception
        {
            System.out.println(removeKDigits("1593212",3));
            System.out.println(removeKDigits("30200",1));
            System.out.println(removeKDigits("10",2));
            System.out.println(removeKDigits("541270936",3));
            
        }
        /**
            * 删除整数的k个数字,获得删除后的最小值
            * @param num  原整数
            * @param k  删除数量
        */
        
        public static String removeKDigits(String num, int k) {
            
            //新整数的最终长度 = 原整数长度 - k
            int newLength = num.length() - k;
            //创建一个栈,用于接收所有的数字
            char[] stack = new char[num.length()];
            int top = 0;
            for (int i = 0; i < num.length(); ++i) {
                //遍历当前数字
                char c = num.charAt(i);
                //当栈顶数字大于遍历到的当前数字,栈顶数字出栈(相当于删除数字)
                while (top > 0 && stack[top-1] > c && k > 0) {
                    top -= 1;
                    k -= 1;
                }
                //遍历到的当前数字入栈
                stack[top++] = c;
            }
            // 找到栈中第一个非零数字的位置,以此构建新的整数字符串
            int offset = 0;
            while (offset < newLength && stack[offset] == '0') {
                offset++;
            }
            return offset == newLength? "0": new String(stack, offset, newLength - offset);
        }
    }

    输出:

    1212
    200
    0
    120936

    C++:

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    int main(){
        
        string num = "541270936";
        int k = 3;
        int size = num.length()-k;
        for (int i=1;i<num.length() && k>0;i++) {
    
            for(int z=i-1;z>=0;z--){
                if(k==0){
                    break;
                }
                if(num[z]=='-'){
                    continue;
                }
                if((int)num[i]<(int)num[z]){
                    num[z]='-';
                    k--;
                }
            }
        }
        int begin = 0;
        bool flag = true;
        while(true){
            if(num[begin]=='-'||(int)num[begin]-48==0){
                begin++;
            }else{
                break;
            }
        }
        for(int j=begin;j<num.length();j++){
            if(num[j]!='-'){
                flag = false;
                cout<<num[j];
            }
        }
        if(flag){
            cout<<"0"<<endl;
        }else{
            cout<<endl;
        }
        
        return 0;
    }
  • 相关阅读:
    SQL Server 2008通过PassPhrase加密数据
    SQL Server 2008之Values
    Merge(在一条语句中使用Insert,Update,Delete) 对两个表进行同步数据
    Linux yum常用命令介绍
    SQL Server 2008之WaitFor
    Android之TelephonyManager类的方法详解
    TextView里的文 html
    adb
    Apk得到Java源代码
    【Android】调用系统应用常用uri & intent设置
  • 原文地址:https://www.cnblogs.com/lyc94620/p/10039915.html
Copyright © 2020-2023  润新知