经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
算法学习——贪心算法之删数字(求最大值) - Stars-one
来源:cnblogs  作者:Stars-one  时间:2018/10/16 9:17:22  对本文有异议

算法描述

在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最大值(原次序不变)

算法思路

  1. 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素

  2. 使用贪心算法,每一步都要达到最优

  3. 从最高位开始,若是下一位比上一位大,则比上一位的数字移出,结束之后再次从最高位开始

例如 16489657 删除4个数字
首先比较1和6 删除1 得到 6489657
之后,再次比较 6和4 往后推 可得到 689657
以此类推 删除4个数字之后 可得到 9657

这里会有个特殊情况,当一个从大大小的整数输入的时候,我们得从末尾删除数字才能得到最大值

例如 98765 删除5 可以得到最大值 9876

算法实现

  1. Scanner scanner = new Scanner(System.in);
  2. System.out.println("请输入整数:");
  3. String s = scanner.nextLine();
  4. System.out.println("删除数字的个数:");
  5. int n = scanner.nextInt();
  6. scanner.close();
  7. int a[] = new int[s.length()];
  8. for(int i=0;i<s.length();i++){
  9. char temp =s.charAt(i);
  10. a[i] = temp -'0';//不减去‘0’则会获得Ascii码
  11. }
  12. LinkedList<Integer> linkedList = new LinkedList<Integer>();
  13. for(int i=0;i<a.length;i++){
  14. linkedList.add(a[i]);
  15. }
  16. int flag =0;
  17. while(flag<n){
  18. for(int i=0;i<linkedList.size()-1;i++){
  19. if(linkedList.get(i)<linkedList.get(i+1)){
  20. linkedList.remove(i);//使用链表移出元素
  21. flag++;
  22. break;//结束本次循环,跳转到while循环中
  23. }
  24. //考虑到特殊情况,当遍历完全部数字都不满足条件,从末尾删除数字
  25. if(i==linkedList.size()-2){
  26. linkedList.removeLast();
  27. flag++;
  28. }
  29. }
  30. }
  31. System.out.print("截取的"+n+"个数字后的最小值为");
  32. for(int i=0;i<linkedList.size();i++){
  33. System.out.print(linkedList.get(i));
  34. }

结果

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号