LintCode-删除数字

给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数, 使得这个新的正整数尽可能的小.

N <= 240, k <= N

样例

给出一个字符串代表的正整数 A 和一个整数 k, 其中A
= 178542
k = 4

返回一个字符串 "12"

分析:每次删除一个字母,从高位到低位,发现s[i]>s[i+1]时,即第i位应该删除,同理可引申到使留下来的正整数尽可能的大,注意最后输出不能有前缀0

代码:

class Solution {
public:
    /**
     *@param A: A positive integer which has N digits, A is a string.
     *@param k: Remove k digits.
     *@return: A string
     */
    string DeleteDigits(string A, int k) {
        // wirte your code here
        string temp = A;
        while(k--)
        {
            int i=0;
            while(i<temp.length()-1&&temp[i]<=temp[i+1])
                i++;
            temp = temp.substr(0,i)+temp.substr(i+1,temp.length()-i-1);
        }
        int i = 0;
        while(i<temp.length()&&temp[i]=='0')
            i++;
        string ret = temp.substr(i,temp.length()-i);
        return ret;
    }
};
时间: 2024-10-25 06:29:50

LintCode-删除数字的相关文章

18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4263868.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字). 当一个数字

LintCode 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素每个元素只留下一个. 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null 分析:先开始的时候是想着head 和head->next作为基准 但其实pre和cur更合适 /** * Definition of ListNode * class ListNode { * public: * int

LintCode 删除链表中的元素

删除链表中等于给定值val的所有节点. 样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5 参考@GrandYang  ... 方法1:引入dummy class Solution { public: /** * @param head a ListNode * @param val an integer * @return a ListNode */ ListNode *r

2017.12.27 算法分析 贪心算法删除数字求最小值问题

1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的: 1.先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取最小值,为什

LintCode 109. 数字三角形

给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 样例 比如,给出下列数字三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11). class Solution { public: /* * @param triangle: a list of lists of integers * @return: An integer, minimum path sum

[LintCode] 删除链表中倒数第n个节点

1 /** 2 * Definition of ListNode 3 * class ListNode { 4 * public: 5 * int val; 6 * ListNode *next; 7 * ListNode(int val) { 8 * this->val = val; 9 * this->next = NULL; 10 * } 11 * } 12 */ 13 class Solution { 14 public: 15 /** 16 * @param head: The fi

字符串中删除数字

1 #include<string.h> 2 #define MAX 100 3 #include<iostream> 4 using namespace std; 5 int main() 6 { 7 printf("在西安的古道,写着庸俗的代码\n"); 8 9 char str[MAX]; 10 int count = 0; 11 cin.getline(str,MAX); 12 int len = strlen(str); 13 char temp[MA

数字证书原理【转】

转自http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理,最后演示使用makecert生成数字证书.如果发现文中有错误的地方,或者有什么地方说得不够清楚,欢迎指出! 1.基础知识 这部分内容主要解释一些概念和术语,最好是先

数字证书原理

文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理,最后演示使用makecert生成数字证书.如果发现文中有错误的地方,或者有什么地方说得不够清楚,欢迎指出! 1.基础知识 这部分内容主要解释一些概念和术语,最好是先理解这部分内容. 1.1.公钥密码体制(public-key cryptography) 公钥密码体制分为三个部分,公钥.私钥.加密解密

求圆圈中剩下的最后一个数字

n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除第m个数字.求出在这个圆圈中剩下的最后一个数字. 这个问题在wiki上叫约瑟夫斯问题. 一开始的序列是 S(n): n-1, 0, 1, 2, 3, ...., n -2 (一个环) 删除了第k=(m-1)%n个数,之后变成 S': n-1, 0, 1,2,...,k-1,k+1,...,n-2 S(n-1)