字符串:字符串匹配、字符串压缩、删除子字符串、 周期字串(最小周期数)、字符串跳步、3-2字符串输入输出函数、不同单词个数统计、递归倒置字符数组、单词个数统计、字符串比较、6-9删除数组中的0元素

字符串匹配

问题描述

  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入格式

  输入的第一行包含一个字符串S,由大小写英文字母组成。
   第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
   第三行包含一个整数n,表示给出的文字的行数。
   接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。

输出格式

  输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。

样例输入

Hello
 1
 5
 HelloWorld
 HiHiHelloHiHi
 GrepIsAGreatTool
 HELLO
 HELLOisNOTHello

样例输出

HelloWorld
 HiHiHelloHiHi
 HELLOisNOTHello

样例说明

  在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。

评测用例规模与约定

  1<=n<=100,每个字符串的长度不超过100

代码

package 字符串;

import java.util.Scanner;

public class 字符串匹配 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String s=sc.next();
		int m=sc.nextInt();//敏感选项
		int n=sc.nextInt();//文字行数
		String[] a=new String[n];
		for(int i=0;i<n;i++){
			a[i]=sc.next();
		}
		
		if(m==1){
			for(int i=0;i<n;i++){
				if(a[i].contains(s)){
					System.out.println(a[i]);
				}
			}
		}else{//不敏感
			s=s.toLowerCase();
			String[] b=new String[n];
			for(int i=0;i<n;i++){
				b[i]=a[i].toLowerCase();
				if(b[i].contains(s))
					System.out.println(a[i]);
			}
		}
		
	}

}

字符串压缩

问题描述
   编写一个程序,输入一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:
   (1) 如果该字符是空格,则保留该字符;
   (2) 如果该字符是第一次出现或第三次出现或第六次出现,则保留该字符;
   (3) 否则,删除该字符。
   例如,若用户输入“occurrence”,经过压缩后,字符c的第二次出现被删除,第一和第三次出现仍保留;字符r和e的第二次出现均被删除,因此最后的结果为:“ocurenc”。
   输入格式:输入只有一行,即原始字符串。
   输出格式:输出只有一行,即经过压缩以后的字符串。
 输入输出样例

样例输入

occurrence

样例输出

ocurenc

代码,注意空格的条件

package 字符串;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class 字符串压缩 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		char[] a=s.toCharArray();
		//创立一个动态数组
		ArrayList<Character> list=new ArrayList<>();
		Map<Character,Integer> map=new HashMap<Character,Integer>();
		for(int i=0;i<s.length();i++){
			if(map.containsKey(a[i])==false){
				map.put(a[i],0);
				//System.out.println(a[i]);
			}
			map.put(a[i],map.get(a[i]).intValue()+1);
			
			if(a[i]==' '){
				list.add(a[i]);
			}
			else if(map.get(a[i])==1||map.get(a[i])==3||map.get(a[i])==6){
					list.add(a[i]);
			}
			
		}
		//for(int i=0;i<map.size();i++){
			//System.out.println(a[i]+"="+map.get(a[i]));
		//}
		for(int i=0;i<list.size();i++)
			System.out.print(list.get(i));
	}

}

周期字串

问题描述

  右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有座山……”这样循环的故事来搪塞右右。
   我们定义,如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就叫做周期为k的串。
   例如:
   字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
   右右现在想给他的朋友大灰狼转述妈妈讲的故事,请帮他写一个程序,可以测定一个字符串的最小周期。

输入格式

  一个最大长度为100的无空格的字符串。

输出格式

  一个整数,表示输入的字符串的最小周期。

样例输入

HaHaHa

样例输出

2

样例输入

Return0

样例输出

7

分析:
  首先,既然是多个相同子串组成的,则主串长度一定能够整除子串长度。
  其次,for循环,判断主串中每一个字符都等于它后移子串长度个位置的字符,这才证明是相同的子串。

package 字符串;

import java.util.Scanner;

public class 周期函数 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		char[] s=sc.next().toCharArray();
		int ans=1;//字符串周期
		while(true){
			while(s.length%ans!=0)//若ans不能整除字符串长度,则递增ans
				ans++;
			boolean f=true;
			for(int i=ans;i<s.length&&f;i+=ans)//进行n/ans重循环
				for(int j=0;j<ans&&f;++j)//判断i~ans-1字符和i~i+ans-1个字符是否完全一致
					if(s[j]!=s[j+i]){//字符不同
						++ans;//递增ans,此周期不对
						f=false;
					}
			if(f)//N/ans重循环字符均一致,跳出循环
				break;
		}
		System.out.println(ans);
	}

}

删除子字符串

问题描述

  编写程序,输入两个字符串,从第一个字符串中删除第二个字符串,输出删除后的字符串。例如输入”abcabcd”和”bc”,则输出”aad”。用指针实现。

输入格式

  输入两个字符串ch1和ch2

输出格式

  输出删除ch2后的字符串ch1

样例输入

一个满足题目要求的输入范例。
 例:
 abcabcd
 
bc

样例输出

与上面的样例输入对应的输出。
 例:
 aad

数据规模和约定

  输入数据中每一个数的范围。
   输入的字符串长度小于100

代码

package 字符串;

import java.util.Scanner;

public class 删除子字符串 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String s1=sc.next();
		String s2=sc.next();
		s1=s1.replaceAll(s2,"");
		System.out.println(s1);
	}

}

字符串跳步

问题描述

  给定一个字符串,你需要从第start位开始每隔step位输出字符串对应位置上的字符。

输入格式

  第一行一个只包含小写字母的字符串。
 
  第二行两个非负整数start和step,意义见上。

输出格式

  一行,表示对应输出。

样例输入

abcdefg
 2 2

样例输出

ceg

数据规模和约定

  start从0开始计数。
   字符串长度不超过100000。

提示

  读入上有问题,可以参照字符串进位。
   尝试不要出现以下代码:for (int i = 0; i < (int) S.size(); ++i)

代码

package 字符串;

import java.util.Scanner;

public class 字符串跳步 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String s=sc.next();
		int start=sc.nextInt();
		int step=sc.nextInt();
		String ss="";
		for(int i=start;i<s.length();i+=step){
			ss+=s.charAt(i);
		}
		System.out.println(ss);
	}

}

3-2字符串输入输出函数

描述

  编写函数GetReal和GetString,在main函数中分别调用这两个函数。在读入一个实数和一个字符串后,将读入的结果依次用printf输出。
   两次输入前要输出的提示信息分别是"please input a number:\n”和"please input a string:\n"

样例输入

9.56
 hello

样例输出

please input a number:
 please input a string:
 9.56
 hello

代码

package 字符串;

import java.util.Scanner;

public class 字符串输入输出函数 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		System.out.println("please input a number:");
		double n=sc.nextDouble();
		System.out.println("please input a string:");
		String s=sc.next();
		System.out.println(n);
		System.out.println(s);
	}

}

不同单词个数统计

问题描述
   编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数。例如:对于句子“one little two little three little boys”,总共有5个不同的单词:one, little, two, three, boys。
   说明:(1)由于句子当中包含有空格,所以应该用gets函数来输入这个句子;(2)输入的句子当中只包含英文字符和空格,单词之间用一个空格隔开;(3)不用考虑单词的大小写,假设输入的都是小写字符;(4)句子长度不超过100个字符。
   输入格式:输入只有一行,即一个英文句子。
   输出格式:输出只有一行,是一个整数,表示句子中不同单词的个数。
 输入输出样例

样例输入

one little two little three little boys

样例输出

5

代码

package 字符串;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class 不同单词个数统计 {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String[] s=br.readLine().split(" ");
		Map<String,Integer> map=new HashMap<String,Integer>();
		for(int i=0;i<s.length;i++){
			if(map.containsKey(s[i])==false){
				map.put(s[i],0);
			}
			map.put(s[i],map.get(s[i]).intValue()+1);
		}
		System.out.println(map.size());
	}

}

代码

package 字符串;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class 不同单词个数统计1 {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String[] s=br.readLine().split(" ");
		Set<String> ss=new HashSet<>();
		for(int i=0;i<s.length;i++)
			ss.add(s[i]);
		System.out.println(ss.size());
	}

}

递归倒置字符数组

问题描述

  完成一个递归程序,倒置字符数组。并打印实现过程
   递归逻辑为:
   当字符长度等于1时,直接返回
   否则,调换首尾两个字符,在递归地倒置字符数组的剩下部分

输入格式

  字符数组长度及该数组

输出格式

  在求解过程中,打印字符数组的变化情况。
   最后空一行,在程序结尾处打印倒置后该数组的各个元素。

样例输入
Sample 1
5 abcde
Sample 2
1 a
样例输出
Sample 1
ebcda
edcba
edcba
Sample 2
a

解法一

package 字符串;

import java.util.Scanner;

public class 递归倒置字符数组 {

	private static char[] a;
	private static int n;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		n = sc.nextInt();
		String s=sc.next();
		a = s.toCharArray();
		if(n==1){
			System.out.println();
			System.out.println(s);
		}
		else{
			for(int i=0;i<n/2;i++){
				char t=a[i];
				a[i]=a[n-1-i];
				a[n-i-1]=t;
				
				for(int j=0;j<n;j++)
					System.out.print(a[j]);
				System.out.println();
			}
			System.out.println();
			for(int j=0;j<n;j++)
				System.out.print(a[j]);
		}
	}

}

字符串比较

独立实现标准字符串库的strcmp函数,即字符串比较函数,从键盘输入两个字符串,按字典序比较大小,前者大于后者输出1,前者小于后者输出-1,两者相等输出0。
 样例输入: apple one 样例输出:-1
 样例输入: hello he样例输出:1
 样例输入: hello hello样例输出:0

代码

package 字符串;

import java.util.Scanner;

public class 字符串比较 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String s1=sc.next();
		String s2=sc.next();
		int n=s1.compareTo(s2);
		if(n>0)
			n=1;
		else if(n==0)
			n=0;
		else
			n=-1;
		System.out.println(n);
	}

}

单词个数统计

问题描述

  编写一个程序,输入一个字符串(长度不超过80),然后统计出该字符串当中包含有多少个单词。例如:字符串“this is a book”当中包含有4个单词。
   输入格式:输入一个字符串,由若干个单词组成,单词之间用一个空格隔开。
   输出格式:输出一个整数,即单词的个数。
   输入输出样例
   用户输入数据样例:
   this is a book
   系统输出数据如下:
   4

代码

package 字符串;

import java.util.Scanner;

public class 单词个数统计 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String[] s=sc.nextLine().split(" ");
		System.out.println(s.length);
	}

}

6-9删除数组中的0元素

  编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接收数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。
   输入时首先读入数组长度,再依次读入每个元素。
   将调用此函数后得到的数组和函数返回值输出。

样例输入

7
 2 0 4 3 0 0 5

样例输出

2 4 3 5
 4
package 字符串;

import java.util.ArrayList;
import java.util.Scanner;

public class 删除数组中的0元素 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int s[] =new int[n];
		for(int i=0;i<n;i++){
			s[i]=sc.nextInt();
		}
		ArrayList<Integer> a=new ArrayList<Integer>();
		for(int i=0;i<s.length;i++){
			if(s[i]!=0)
				a.add(s[i]);
		}
		for(int i=0;i<a.size();i++)
			System.out.print(a.get(i)+" ");
		System.out.println();
		System.out.println(a.size());
	}

}

发布了342 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44522477/article/details/105309313