删除数字
来源:互联网 发布:appscan 数据库 编辑:程序博客网 时间:2024/06/16 15:28
删除数字 Lintcode 182
已知:
给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。(找到删除 k 个数字之后的最小正整数, 并且 N <= 240, k <= N)
示例:
给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4返回一个字符串 "12"
思路:
复杂的思路 ( 以A = "178542", k = 4为例 ):①首先,将K转化为剩余几个数字要取( 在这里取2 ),便于理解和函数迭代②178542需要取 ( A.length - K = ) 两位数字,所以第一位是原字符串除最后一位外的非0最小数 ( 也就是说在17854中取十位)③函数迭代,A从当前取得最小值的位置开始迭代,要取的位数也减1④当要取的位数为0时 ( 终止条件), 返回空字符串
我起初的代码是:
public class Solution { public String DeleteDigits(String A, int l) { return calculate(A, A.length() - l, 0); } //remainLength指的是还要取几位数字 private String calculate(String A, int remainLength, int flag) { if (remainLength == 0) { return ""; } char[] cs = A.substring(0, A.length() - remainLength + 1).toCharArray(); //index还特意分了能不能取0 int index = findMinIndex(cs, flag); if (index == cs.length - 1) { return A.substring(index); } else { return A.substring(index, index + 1) + calculate(A.substring(index + 1), remainLength - 1, 1); } } private int findMinIndex(char[] cs, int flag) { int minIndex = 0; char minValue = cs[0]; for (int i = 1; i < cs.length; i++) { if (cs[i] < minValue) { if (flag == 0 && cs[i] == '0') { continue; } minIndex = i; minValue = cs[i]; } } return minIndex; }}
然而!!然而题目的意思是即使你取的字符串以0开头也是可以的,结果里去除开头所有0就可以了!!非常无奈,测试的时候才发现题意比我想的简单多了,修改代码如下:
public class Solution {public String DeleteDigits(String A, int l) { return calculate(A, A.length() - l); } private String calculate(String A, int remainLength) { if (remainLength == 0) { return ""; } char[] cs = A.substring(0, A.length() - remainLength + 1).toCharArray(); int index = findMinIndex(cs); if (index == cs.length - 1) { return deleteFrontZero(A.substring(index)); } else { String temp = A.substring(index, index + 1); if ("0".equals(temp)) return calculate(A.substring(index + 1), remainLength - 1); return temp + calculate(A.substring(index + 1), remainLength - 1); } } private String deleteFrontZero(String substring) { char[] cs = substring.toCharArray(); int flag = -1; for (int i = 0; i < substring.length() - 1; i++) { if (cs[i] != '0') { flag = i; break; } } if (flag == -1) return substring.substring(substring.length() - 1); return substring.substring(flag); } private int findMinIndex(char[] cs) { int minIndex = 0; char minValue = cs[0]; for (int i = 1; i < cs.length; i++) { if (cs[i] < minValue) { minIndex = i; minValue = cs[i]; } } return minIndex; } }
诶,题意不清多花了好些时间,不过希望对您有所帮助,(;′⌒`)
阅读全文
0 0
- 删除数字
- 删除数字
- 删除数字
- 删除数字
- 删除数字
- 删除数字
- AOJ191 删除数字
- [java]间隔删除数字
- 删除字符串中的数字
- C 语言 数字删除
- 字符串删除数字
- 题目:删除数字
- lintcode-删除数字-182
- lintcode 删除数字
- 删除重复数字,java
- 删除数字vba
- LintCode 182-删除数字
- LintCode :删除数字
- jbpm入门
- mysql学习笔记
- OPNET中Process Model编译出现“IDB是PDB文件的非法扩展”的解决方法
- 并发编程 atomic collections
- STM32 USB无法连接电脑
- 删除数字
- 第8章 图形化显示地震危机数据(海地)
- 20171206 水仙花数<一>
- android的阻尼效果-ListView添加阻尼效果的HeadView
- 1003. 我要通过!(20)
- POJ 3087 Shuffle'm Up 模拟
- JAVA | 54
- jdk源码序言
- leetcode 27. Remove Element移出元素(双指针)