洛谷算法题

本文介绍了字符串拼接、子串获取、插入、位置查找等基本操作,重点讲解了查找单词出现次数与首次位置的方法,并探讨了P3741键盘修改和P1598垂直柱状图的字符串处理技巧。通过实例演示,展示了如何高效利用StringBuilder和字符串处理策略优化性能。
摘要由CSDN通过智能技术生成

一、字符串

1、字符串各种操作

原题链接

知识点:

  1. 字符串拼接:str=str+s;

  2. 获取字符串子串:str . substring( index1 , index2);

  3. 字符串插入:

    StringBuilder sb=new StringBuilder();
    sb.append(str).insert(index, s);//在str字符串的index位置之后插入s字符串用StringBuilder的append和insert方法
    
  4. 获取字符串的位置:

    str.indexOf(s)//获取s字符串在str字符串中第一次出现的位置下标
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RwUw01kp-1633251914868)(C:\Users\mi\AppData\Roaming\Typora\typora-user-images\1621482233681.png)]26个大小写字母的对应的ASCII值

2、查找单词

原题链接

代码:

package 洛谷基础题_字符串;

import java.util.Scanner;

public class P1308 {

	public static void main(String[] args) 		{
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		s=s.toLowerCase();
		String str=sc.nextLine();
		str=str.toLowerCase();
		String[]c=str.split(" ");
		int count=0;
		for(int i=0;i<c.length;i++) {
			if(c[i].equals(s)) {
				count++;
			}
		}
		if(count==0) {
			System.out.print(-1);
		}else {
			System.out.print(count+" "+(" "+str+" ").indexOf(" "+s+" "));
		}
		
	}

}

  1. 判断出现次数的时候要把字符串通过空格分割成单词数组,匹配加一。
  2. 判断第一次出现位置的时候不能直接用str .indexOf(s);,因为这样匹配到的第一个位置可能是另一个单词的一部分。如s=“he”,str=“she is a beautiful girl. he like her.” 这样第一个位置就是1而不是23。所以str和sq前后要加空格,这样表示一个单词。

3、P3741 honoka的键盘

原题链接

代码

package 洛谷基础题_字符串;

import java.util.Arrays;
import java.util.Scanner;

public class P3741 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		String str=sc.next();
		char []c=str.toCharArray();
		int count=0;
		int num=0;
		for(int i=0;i<n-1;i++) {
			if(c[i]=='V'&&c[i+1]=='K') {
				c[i]='X';
				c[i+1]='X';
				count++;
			}
		}
		for(int i=0;i<n-1;i++) {
			if((c[i]=='V'&&c[i+1]=='V')||(c[i]=='K'&&c[i+1]=='K')) {
				num+=1;
			}
		}
		System.out.println(num==0?count:count+1);
		
	}

}

  1. 先统计出现 VK 的次数,然后统计有没有VV或者KK,但是要遍历一遍不,VK改成其他的字母(如VVKK,VK次数为1,有VV也有KK,最后统计次数为2,与实际不符)。如果有VV或者KK,则count+=1;

4、P1598 垂直柱状图

原题链接

代码:

package 洛谷基础题_字符串;

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

public class P1598 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int[] num=new int [26];//字母出现次数
		int max=0;
		StringBuilder sb=new StringBuilder();
		for(int j=0;j<4;j++) {
			String str=sc.nextLine();
			char []c=str.toCharArray();
			for(int i=0;i<c.length;i++) {
				if(c[i]>='A'&&c[i]<='Z') {
					num[c[i]-'A']++;
				}
			}
		}
		for(int i=0;i<num.length;i++) {
			max=Math.max(max,num[i]);
		}
		for(int i=max;i>0;i--) {
			for(int j=0;j<26;j++) {
				if(num[j]>=i) {
					sb.append("* ");
				}else {
					sb.append("  ");
				}
			}
			sb.append("\n");
		}
		for(int i=0;i<num.length;i++) {
			sb.append((char)(i+'A'));
			sb.append(" ");
		}
		System.out.println(sb.toString());
	}

}

  1. 拼串是非常耗时的,会超出指定的时间,所以可以用 StringBuilder的append方法,输出sb.toString();

  2. 把元素作为下标统计出现的个数、

  3. 求出最大的个数,如果某个字母大于等于最大个数就输出*,否则输出空格

  4. int+char会转化成int,所以要强转为char

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值