1. 程式人生 > >求出現最多的字串和次數,如有多個全部輸出

求出現最多的字串和次數,如有多個全部輸出

注:方法有多個這裡只是其中一中。

1.解題思路

(1)引入TreeSet,通過集合找出所有出現的字串

(2)引入ArrayList:快速排序,在通過StringBuffer生成排序後的字串

(3)通過String API中的indexOf()找出第一次出現的下標,lastIndexOf最後一次出現的下標求出其長度。

(4)記錄第一個出現次數最多的字元(為了計算多個字元相同的情況)

(5)求出的字串放入集合中儲存

2.程式碼

public class Demo3 {
	public void doString(String  input){
		char[] chars=input.toCharArray();//char型別陣列
		ArrayList<String> lists=new ArrayList<String>();
		TreeSet<String> set=new TreeSet<String>();
		
		for (int i = 0; i < chars.length; i++) {
			lists.add(String.valueOf(chars[i]));
			set.add(String.valueOf(chars[i]));
		}
		Collections.sort(lists);
		System.out.println(lists);
		System.out.println(set);
		StringBuffer sb=new StringBuffer();
		for (int i = 0; i < lists.size(); i++) {
			sb.append(lists.get(i));
		}
		String input1 = sb.toString(); //排序後的字串
		String input2 = lists.toString();//直接liststoString是不行的我們可以看後面的下標列印情況
		System.out.println(input1);
		int max=0; // 記錄最大的數
		String maxString="";
		ArrayList<String> maxList=new ArrayList<String>(); // 儲存最大的字串
		Iterator<String> iterator = set.iterator(); 
		while(iterator.hasNext()){
			String str = iterator.next();// 迭代器迭代每個不重複的字元
			System.out.println("---------這是lists直接toString的下標------------");
			System.out.println(input2.indexOf(str));
			int begin = input1.indexOf(str);
			int end = input1.lastIndexOf(str);
			int length=end-begin+1;
			if(length>max){
				max=length;
				maxString=str; //去重複因為我們只需要匹配最大的字元
				maxList.add(str);
			}
			else if(length==max){
				maxList.add(str);
			}
		}
		int index=0;
		for (int i = 0; i < maxList.size(); i++) {
			if(maxList.get(i).equals(maxString)){
				index=i;
				break;
			}
		}
		System.out.println("出現次數最多的為");
		for (int i = index; i < maxList.size(); i++) {
			System.out.println(maxList.get(i)+"出現"+max);
		}
	}
	public static void main(String[] args) {
			new Demo3().doString("dsdsadaa");
	}

3.執行結果

4.為什麼直接list直接toString不行呢?因為我們從他的原始碼可以看出作為字串的方法他是包含了括號和“,”以及空格的所以輸出的下標為1 ,10 ,19(每個字母第一次出現的下標)


相關推薦

出現字串次數全部輸出

注:方法有多個這裡只是其中一中。 1.解題思路 (1)引入TreeSet,通過集合找出所有出現的字串 (2)引入ArrayList:快速排序,在通過StringBuffer生成排序後的字串 (3)通過String API中的indexOf()找出第一次出現的下標,lastI

給定字串出現次數的那個字母及次數重複則都輸出

給定字串,求出現次數最多的那個字母及次數,如有多個 重複則都輸出。 eg,String data ="aaavzadfsdfsdhshdWashfasdf"; 這是一道很基礎的面試題,在別的部落格上也

小菜鳥之搭建環境(IntelliJ IDEA+Springboot+Gradle4.8+Git2.19+JDK1.8) 僅供大家學習交流疏漏敬請留言

一、IntelliJ IDEA 1.1 IDEA介紹      IDEA 全稱 IntelliJ IDEA,是java程式語言開發的整合環境。IntelliJ在業界被公認為最好的java開發工具之一。支援多種外掛的配置,使程式碼更簡潔。工作中接

UVALive - 3938 分治線段樹動態大連續

click typedef %d make pac comment blank eof return UVALive - 3938 題意: 給出一個長度為n的整數序列D,你的任務是對m個詢問作出回答。對於詢問(a,b),需要找到兩個下標x和y,使得a≤x≤y&

輸入兩正整數mn大公約數小公倍數。

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int a = scanner.nextInt

C語言例項—輸入兩正整數mn大公約數小公倍數(gcc 編譯)。

1.輾轉相除法 輾轉相除法是古希臘求兩個正整數的最大公約數的,也叫歐幾里德演算法,其方法是用較大的數除以較小的數,上面較小的除數和得出的餘數構成新的一對數,繼續做上面的除法,直到出現能夠整除的兩個數,其中較小的數(即除數)就是最大公約數。以求288和123的最大公約數為例,操作如下: 288÷1

【程式6】  題目:輸入兩正整數mn大公約數小公倍數。

在迴圈中,只要除數不等於0,用較大數除以較小的數,將小的一個數作為下一輪迴圈的大數,取得的餘數作為下一輪迴圈的較小的數,如此迴圈直到較小的數的值為0,返回較大的數,此數即為最大公約數,最小公倍數為兩數之積除以最大公約數。 import java.util.Scanner;

鍵入兩個數大公約數小公倍數----初學c

#include <stdio.h> void fun1(int *x,int *y); //將兩個數比較大小,使x>y void fun2(int *a,int *b); //輾轉反側法 void main() { /*定義變數*

輸入兩正整數mn大公約數小公倍數 C/C++

題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 1.程式分析:利用輾除法。 2.程式原始碼: #include <stdio.h> int main() { int a,b,num1,num2,temp; printf("請輸入2個正整數:\

【程式6】 題目:輸入兩正整數mn大公約數小公倍數。

/* 2017年3月2日15:10:11 java基礎50道經典練習題 例6 Author:ZJY(&&) Purpose:最大公約數和最小公倍數的應用 最大公約數:把每個數分別分解質因數,再把各數中的全部公有質 因數提取出來連乘,所得的積就

c語言:輸入兩正整數mn大公約數小公倍數

輸入兩個正整數m和n,求其最大公約數和最小公倍數。解:程式:#include <stdio.h>int main(){int num1, num2, t,p;printf("請輸入兩個正整數

(c++)輸入兩正整數mn大公約數小公倍數。

#include<iostream> using namespace std; int main() {int m,n,i,j,a;cin>>m>>n;j=m*n;

【程式16】 題目:輸入兩正整數mn大公約數小公倍數。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> /* 【程式16】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 【分析】 最大公約數:輾除法 最小公倍數:兩數之積除以最大公約數 */ int main(int argc,

C語言例項12——輸入兩正整數mn大公約數小公倍數。

題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 //程式分析:利用輾除法。 #include<stdio.h> int main(){ int a,b,num1,num2,te

輸入兩正整數mn大公約數小公倍數(java)

package com.gaoshixian; import java.util.Scanner; public class Test { public static void main(String[] args) { int a, b, num1, num2,

夜讀 | 讀書不讀書的人生差別

important 陽光 scene vertical 訂閱 ica 鞋子 80年 pla 夜讀 | 讀書和不讀書的人生,差別有多大 2017-08-02新華社導讀讀書讓人擁有富足的內心,那是千金不換的財富。- 1 -我剛畢業時被分到一所鄉村中學任教,那年百年一遇的大洪

element ui 的Notification通知如何加 a 標簽按鈕並彈

都是 ast pkg 前言 asc scrip 如何 pos close 前言:工作中需要在頁面右下角彈出很多個提醒框,提醒框上有一個可點擊的a標簽,並有一個按鈕,同時還需要一次性關閉所有的彈出框。轉載請註明出處:https://www.cnblogs.com/yuxia

[WC2011]大XOR路徑洛谷P4151線性基+Dfs

正題       這一題挺水的?       直接隨便求一條1到n的路徑異或和,建出Dfs樹,每一條返祖邊與兩點之間路徑異或和組成環,扔進線性基,最後維護一遍即可。       首先證明為什麼只

【程式設計網格無水題】【動態規劃篇】之【字串

Written By MorrowWind,csdnicewing 可以到洛谷的P115上去練習  https://www.luogu.org/problemnew/show/P1115 題目描述         給出資料個

UVA-11107 Life Forms(出現K次的子串後綴數組+二分答案)

add src break 數組 nbsp line 技術 字符串長度 http 題解: 題意: 輸入n個DNA序列,你的任務是求出一個長度最大的字符串,使得它在超過一半的DNA序列中出現。如果有多解,按照字典序從小到大輸入所有解。 把n個DNA序列拼在一起,中間