zoukankan      html  css  js  c++  java
  • 在字符串中找出连续最长的数字串

    输入描述:

    输入一个字符串。

    输出描述:

    输出字符串中最长的数字字符串和它的长度。

    输入例子:
    abcd12345ed125ss123058789,如果有重复的最大长度的数字串,则一起输出,如1456jk4789,输出14564789,4
    
    输出例子:
    123058789,9


    思路:先把字符串中的数字串取出来,然后取出长度最大的数字字串并输出,刚开始我使用HashMap的key存储数字字串,value存字串长度,考虑到HashMap存储无序,故改为LInkedHashMap,然后根据Map的value值排序,取出value值最大的map元素并输出,但是忽略一个特殊情况,就是当最大子串有若干个且相同,则map由于key不能重复,只会存储一个,故有缺陷,但是却被AC,后来使用list来存储,解决了此问题并被AC,

    先上有缺陷代码:
     1 import java.util.ArrayList;
     2 import java.util.Collections;
     3 import java.util.Comparator;
     4 import java.util.Iterator;
     5 import java.util.LinkedHashMap;
     6 import java.util.List;
     7 import java.util.Map;
     8 import java.util.Map.Entry;
     9 import java.util.Scanner;
    10 import java.util.Set;
    11 
    12 public class Test10 {
    13 
    14     public static void main(String[] args) {
    15         Scanner sc = new Scanner(System.in);
    16         while (sc.hasNext()) {
    17             String s = sc.next();
    18             Map<String,Integer> mp = new LinkedHashMap<String,Integer>();//使用Linked哈希保证元素的有序性
    19             String s1 = s.replaceAll("[a-z]", " ");//把字符串中的字母全部替换为空格
    20             String[] str = s1.split(" ");//以空格分割字符串
    21             for (int i = 0; i < str.length; i++) {//把字符串中连续的数字串存至map中,其中key为数字串,value为数字串长度
    22                 if (str[i].length() != 0) {//由于有连续空格,使用空格分割时会出现多个空子串,空子串不予考虑,故有此判断
    23                     if (str[i].charAt(0) != ' ') {
    24                         mp.put(str[i], str[i].length());
    25                     }
    26                 }
    27             }
    28 //System.out.println(mp);
    29 //System.out.println("-------");
    30 
    31             List<Map.Entry<String, Integer>> li = new ArrayList<Map.Entry<String,Integer>>();//用来存储Map.Entry<String, Integer>类型
    32             Set<Entry<String, Integer>>se = mp.entrySet();//获得map的Map.Entry<String, Integer>类型
    33             Iterator<Entry<String, Integer>> it = se.iterator();
    34             while(it.hasNext()){//把Map.Entry<String, Integer>类型元素存入list中,以便排序
    35                 Entry<String, Integer> en = it.next();
    36                 li.add(en);
    37 //System.out.println(en);
    38             }
    39 //System.out.println("-------");
    40             Collections.sort(li, new Comparator<Entry<String, Integer>>() {//使用Collections集合工具类对list中Entry类型元素按照value进行自然升序排序
    41 
    42                 @Override
    43                 public int compare(Entry<String, Integer> o1,
    44                         Entry<String, Integer> o2) {
    45                     // TODO Auto-generated method stub
    46                     return o1.getValue().compareTo(o2.getValue());
    47                 }
    48             });
    49             
    50 //Iterator<Entry<String, Integer>> it1 = se.iterator();            
    51 //while(it1.hasNext()){
    52 //System.out.println(it1.next());
    53 //            }
    54 //System.out.println("-------");
    55 
    56 
    57             StringBuffer sb = new StringBuffer();//用来存储长度最大且相等的数字串
    58             for(int i=0;i<li.size();i++){
    59                 if(li.get(li.size()-1).getValue()==li.get(i).getValue()){
    60                     sb.append(String.valueOf(li.get(i).getKey()));
    61                 }
    62             }
    63             System.out.println(sb+","+li.get(li.size()-1).getValue());
    64         }
    65     }
    66 }

    上面代码如果输入时1234hj1234,则不会输出正确结果12341234,4 ,会输出1234,4,下面使用list

     1 import java.util.ArrayList;
     2 import java.util.Collections;
     3 import java.util.Comparator;
     4 import java.util.List;
     5 import java.util.Scanner;
     6 
     7 public class Test11 {
     8 
     9     public static void main(String[] args) {
    10         Scanner sc = new Scanner(System.in);
    11         while (sc.hasNext()) {
    12             String s = sc.next();
    13             List<String> li = new ArrayList<String>();
    14             String s1 = s.replaceAll("[a-z]", " ");// 把字符串中的字母全部替换为空格
    15             String[] str = s1.split(" ");// 以空格分割字符串
    16             for (int i = 0; i < str.length; i++) {// 把字符串中连续的数字串存至map中,其中key为数字串,value为数字串长度
    17                 if (str[i].length() != 0) {// 由于有连续空格,使用空格分割时会出现多个空子串,空子串不予考虑,故有此判断
    18                     if (str[i].charAt(0) != ' ') {
    19                         li.add(str[i]);
    20                     }
    21                 }
    22             }
    23 
    24             Collections.sort(li, new Comparator<String>() {
    25 
    26                 @Override
    27                 public int compare(String o1, String o2) {//这里根据list中的字符串元素长度大小进行自然排序
    28                     // TODO Auto-generated method stub
    29                     return Integer.valueOf(o1.length()).compareTo(
    30                             Integer.valueOf(o2.length()));
    31                 }
    32             });
    33             StringBuffer sb = new StringBuffer();//用来存储长度最大且相等的数字串
    34             for (int i = 0; i < li.size(); i++) {
    35                 if (li.get(i).length() == li.get(li.size() - 1).length()) {
    36                     sb.append(li.get(i));
    37                 }
    38             }
    39 
    40             System.out.println(sb + "," + li.get(li.size() - 1).length());
    41         }
    42     }
    43 }

  • 相关阅读:
    二次离线莫队
    串串题-各种算法的应用
    插头dp 笔记
    ST03模拟赛#1 比赛记录
    AtCoder Regular Contest 123 比赛记录(vp)
    冷门trick:线性区间单调求和
    dp优化瞎吹
    概率期望
    NOI挑战赛#2 (vp) 记录
    动态规划-线性dp-序列组成-5833. 统计特殊子序列的数目
  • 原文地址:https://www.cnblogs.com/crazybuddy/p/5396554.html
Copyright © 2011-2022 走看看