1.CCF 201409-3 字符串匹配
【问题描述】
给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。
你的程序还需支持大小写敏感选项:当选项打开时,
表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
【输入形式】
输入的第一行包含一个字符串S,由大小写英文字母组成。
第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字的行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
【输出形式】
输出多行,每行包含一个字符串,
按出现的顺序依次给出那些包含了字符串S的行。
【样例输入】
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
【样例输出】
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
【样例说明】
在上面的样例中,第四个字符串虽然也是Hello,
但是大小写不正确。如果将输入的第二行改为0,
则第四个字符串应该输出。
【评分标准】
评测用例规模与约定
1<=n<=100,每个字符串的长度不超过100。
import java.util.*;
public class Test1{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String t = sc.next();
int type = sc.nextInt();
if(type == 0)
t = t.toLowerCase();
int n = sc.nextInt();
String[] ss = new String[n];
for(int i = 0; i < n; i++)
ss[i] = sc.next();
sc.close(); //关闭Scanner对象,释放资源
//如果不加sc.close(),Scanner对象将一直保持打开状态,
//这可能会导致资源泄漏和程序运行异常。在某些情况下,
//这可能会导致程序崩溃或出现内存泄漏等问题。
//因此,为了确保程序的稳定性和安全性,
//建议在使用完Scanner对象后,调用close()方法关闭它。
//这样可以释放资源并避免潜在的问题。
for(int i = 0; i < n; i++)
if(type == 0){
if(ss[i].toLowerCase().contains(t))
System.out.println(ss[i]);
}
else if(ss[i].contains(t))
System.out.println(ss[i]);
}
}
2.song:对输入串的约定处理
【问题描述】要求用户对输入的串进行处理,处理规则如下:
(1)每个单词首字母大写
(2)数字与字母间用“_”分开
(3)单词间多个空格压缩为一个空格
【输入形式】
this is a 99cat
【输出形式】
This Is A 99_cat
【样例输入】
you and me what cpp2005program
【样例输出】
You And Me What Cpp_2005_program
import java.util.*;
public class Test2{
public static void main(String[] args)
{
String a = new Scanner(System.in).nextLine();
if((a.charAt(0) >= 'a' && a.charAt(0) <= 'z') || (a.charAt(0) >= 'A' && a.charAt(0) <= 'Z')){
a = (char)(a.charAt(0) - 32) + a.substring(1);
}
a = a.replaceAll(" +"," "); //单词间多个空格压缩为一个空格
for(int i = 0; i < a.length() - 1; i++){
if(a.charAt(i) == ' ' && (a.charAt(i + 1) >= 'a' && a.charAt(i + 1) <= 'z')){
a = a.substring(0, i + 1) + (char)(a.charAt(i + 1) - 32) + a.substring(i + 2);
}
else if(((a.charAt(i) >= 'a' && a.charAt(i) <= 'z') || (a.charAt(i) >= 'A' && a.charAt(i) <= 'Z'))
&&((a.charAt(i + 1) >= '0' && a.charAt(i + 1) <= '9')) ||((a.charAt(i + 1) >= 'a' && a.charAt(i + 1) <= 'z')||(a.charAt(i + 1) >= 'A' && a.charAt(i + 1) <= 'Z'))
&& ((a.charAt(i) >= '0' && a.charAt(i) <= '9'))){
a = a.substring(0, i + 1) + "_" + a.substring(i + 1);
}
}
System.out.println(a);
}
}
Java 中的 replaceAll() 是一种字符串替换函数,可用于用一个字符串或一个正则表达式替换目标字符串中的所有匹配项。replaceAll() 方法返回新的字符串,而不更改原始字符串。
该方法有两个参数:第一个参数是要被替换的字符串或正则表达式,第二个参数是替换字符串,可以是字符串或者一个 Lambda 函数。
使用字符串进行替换时,replaceAll() 可以将字符串中出现的所有匹配字符都替换为指定的字符串;当使用一个正则表达式时,则可以将所有与之匹配的子字符串都替换为指定字符串。同时,replaceAll() 的参数支持使用反斜杠(\)字符来转义特殊字符。
示例用法:
String str = "hello world";
String newStr = str.replaceAll("l", "L");
System.out.println(newStr); // 输出 heLLo worLd
String str = "hello world";
String newStr = str.replaceAll("\\s", "");
System.out.println(newStr); // 输出 helloworld,去除了空格
3.扩展字符A
【问题描述】
从键盘输入包含扩展符’-'的字符串,将其扩展为等价的完整字符,例如将a-d扩展为abcd,并输出扩展后的字符串。
要求:只处理[a-z]、[A-Z]、[0-9]范围内的字符扩展,即只有当扩展符前后的字符同时是小写字母、大写字母或数字时才进行扩展,其它情况不进行扩展,原样输出。例如:a-R、D-e、0-b、4-B等字符串都不进行扩展。
【输入形式】
从键盘输入包含扩展符的字符串
【输出形式】
输出扩展后的字符串
【输入样例1】
ADEa-g-m02
【输出样例1】
ADEabcdefghijklm02
【输入样例2】
cdeT-bcd
【输出样例2】
cdeT-bcd
【样例说明】
将样例1的输入ADEa-g-m02扩展为:ADEabcdefghijklm02;样例2的输入cdeT-bcd中,扩展符前的字符为大写字母,扩展符后的字符为小写字母,不在同一范围内,所以不进行扩展。
import java.util.*;
public class Test3{
public static void main(String args[]){
String s;
int i;
char c;
Scanner input = new Scanner (System.in);
s = input.nextLine();
char a[] = s.toCharArray();
for (i = 0; i < s.length(); i++)
{
if(a[i] == '-')
{
if(Character.isDigit(a[i - 1]) && Character.isDigit(a[i + 1]))
{
c = a[i - 1]++;
while(c < a[i + 1] - 1)
{
c = a[i - 1]++;
System.out.printf("%c",c);
}
}
else if(Character.isUpperCase(a[i - 1]) && Character.isUpperCase(a[i + 1]))
{
c = a[i - 1]++;
while(c < a[i + 1] - 1)
{
c = a[i - 1]++;
System.out.printf("%c", c);
}
}
else if(Character.isLowerCase(a[i - 1]) && Character.isLowerCase(a[i + 1]))
{
c = a[i - 1]++;
while(c < a[i + 1] - 1)
{
c = a[i - 1]++;
System.out.printf("%c", c);
}
}
else System.out.print("-");
}
else System.out.printf("%c", a[i]);
}
}
}
4.二进制串分解
【问题描述】
输入一行字符串:它由若干个长度不等的,连续的’0’、‘1’字符组成的字符子串被长度不等的’.‘字符间隔。将连续的’0’、'1’字符子串看成是是二进制数。要求将其转换为十进制整数,并将转换后的这些十进制数按从大到小的顺序输出。其中字符子串的首字符代表二进制数的符号位,'0’表示正数,'1’表示负数(例如,:"0111"表示7 ,"1111"表示-7)。
【输入形式】
输入的一行字符串,以回车结束
【输出形式】
从大到小输出若干转换后的整数,每个整数用一个空格隔开
【样例输入】
…111100.01111.01100111…0111…110000.011…
【样例输出】
103 15 7 3 -16 -28
java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class BinaryToDecimal {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine(); // 读取输入的字符串
String[] nums = input.split("\\."); // 将字符串按照 '.' 分隔成数字部分
List<Integer> list = new ArrayList<>(); // 存储转换后的整数
for (String num : nums) {
if (num.length() == 0) { // 跳过空字符串
continue;
}
int sign = num.charAt(0) == '0' ? 1 : -1; // 获取符号位
int val = 0;
for (int i = 1; i < num.length(); i++) {
val = val * 2 + (num.charAt(i) - '0'); // 将剩余部分转换为十进制数
}
list.add(sign * val); // 存储处理后的整数
}
Collections.sort(list, Collections.reverseOrder()); // 将整数列表按照降序排列
for (int num : list) {
System.out.print(num + " "); // 输出整数列表,每个数字之间用空格隔开
}
}
}
/*
程序首先读取用户输入的字符串,然后将其按照 "." 分隔成二进制数字的部分。
接着对于每个二进制数字,程序将其转换为十进制整数,并存储到一个列表中。
最后,程序使用 Collections.sort() 方法将整数列表按照降序排列,并输出每个整数。
注意,在判断符号位时,需要根据题目要求将 '0' 视为正数符号位,
将 '1' 视为负数符号位。另外,当遇到空字符串时应该跳过处理。
*/
String[] nums = input.split("\\.");
这段代码是将一个字符串 input 按照点号(“.”)进行拆分,并将拆分后的结果存储到一个字符串类型的数组中。
在 Java 中,split() 方法用于将一个字符串按照指定的分隔符进行拆分,返回一个字符串类型的数组。而在这里,我们使用了正则表达式,“.” 表示匹配点号字符 “.”;由于点号在正则表达式中有特殊含义,因此使用两个反斜杠对其进行转义。
数组声明语句 String[] nums 表示定义了一个字符串类型的数组对象 nums,其中数组的元素个数与被拆分的字符串中点号的个数有关,例如 “4.2.0” 将拆成长度为 3 的字符串数组。
完整的代码如下:
String input = "192.168.1.1";
String[] nums = input.split("\\.");
// 输出拆分后的每个元素
for (String num : nums) {
System.out.println(num);
}
以上代码将一个 IP 地址字符串按照点号进行拆分,输出拆分后得到的每个部分,从而实现了对 IP 地址的解析处理。
5.字符串模糊统计
【问题描述】
统计一个字符串中“co?e”字符串出现的次数,该统计支持模糊查找,?号代表任意一个小写字母,则“code”,“cope”,“coze” 等都是符合计数的子串
【输入形式】
一个字符串
【输出形式】
一个整数,表示符合条件子串的个数
【样例输入1】
aaacodebbb
【样例输出1】
1
【样例输入2】
codexxcode
【样例输出2】
2
【样例输入3】
cozexxcope
【样例输出3】
2
import java.util.Scanner;
class Main
{
public static int countCode(String str) {
int count = 0;
for (int i = 0; i < str.length() - 3; i++) {
if (str.charAt(i) == 'c' && str.charAt(i+1) == 'o' && str.charAt(i+3) == 'e') {
count++;
}
}
return count;
}
public static void main(String[] args) {
String s;
Scanner input = new Scanner(System.in);
s = input.nextLine();
System.out.println(countCode(s));
}
}