zoukankan      html  css  js  c++  java
  • 最大数

    给定一个整数,从整数当中去掉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;
    }
  • 相关阅读:
    ["Visual Studio快捷键" ,"Vs","IDEA快捷键"]
    文件夹
    x
    软考.第一章-信息化和信息系统
    软考.起航篇
    Global.asax.cs 为 /.aspx 执行子请求时出错。 Server.Transfer
    网关我选 Spring Cloud Gateway
    我面向 Google 编程,他面向薪资编程
    JDK 13 都已经发布了,Java 8 依然是最爱
    Spring Cloud 系列之 Spring Cloud Stream
  • 原文地址:https://www.cnblogs.com/lyc94620/p/10039915.html
Copyright © 2011-2022 走看看