洛谷题单:【入门5】字符串

(1)P5733 【深基6.例1】自动修正
第一道字符串的题目,小写转大写,两种做法,第一种直接调用字符串自带的转换函数,第二种,遍历字符串,判断如果是小写字符的话就转换成大写,但我觉得直接用第一种就完事了,又快又稳。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println(sc.nextLine().toUpperCase());
	}
}

(2)P1914 小书童——密码
遍历字符串,将每个字符加n形成新的字符,特判下当新的字符超过了z要回到a。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		sc.nextLine();
		String s=sc.nextLine();
		for(int i=0;i<s.length();i++) {
			int x=s.charAt(i)+n;
			if(x>122) {
				x-=26;
			}
			System.out.print((char)x);
		}
	}
}

(3)P1125 笨小猴
很水的一道普及难度题目。用一个26长度的数组存各个字符出现的次数,找到最大值和最小值,然后判断他们相减是不是质数。如果是就输出Lucky Word和相减的数,不是就是输出No Answer和0。

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		int[] arr=new int[26];
		int min=Integer.MAX_VALUE,max=0;
		for(int i=0;i<s.length();i++) {
			arr[(int)(s.charAt(i)-97)]++;
		}
		for(int i=0;i<26;i++) {
			if(arr[i]!=0)
				min=Math.min(min, arr[i]);
			max=Math.max(max, arr[i]);
		}
		if(prime(max-min)) {
			System.out.println("Lucky Word");
			System.out.println(max-min);
		}
		else {
			System.out.println("No Answer");
			System.out.println(0);
		}
	}
	public static boolean prime(int n) {
		if(n<2) {
			return false;
		}
		for(int i=2;i*i<=n;i++) {
			if(n%i==0) {
				return false;
			}
		}
		return true;
	}
}

(4)P1957 口算练习题
这道题稍微有一点繁琐,因为它可能输入两个数字或者输入1个字母和两个数字,我们要分情况讨论,我们不妨先用一个变量来保存到这个操作符,然后读入每行,如果有3个数据,我们就更新掉这个操作符,如果是2个数据就沿用上一个操作符。然后就是两数相加,拼接成一个字符串,输出这个字符串和它的长度。
PS:这里提交一直报错,后面看别人说,这里最后一行不能加换行!!坑

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		sc.nextLine();
		char x='+';
		int num=0;
		String ss;
		for(int i=0;i<n;i++) {
			String[] s=sc.nextLine().split(" ");
			if(s.length==3) {
				if(s[0].charAt(0)=='a') {
					x='+';
					num=Integer.valueOf(s[1])+Integer.valueOf(s[2]);
				}
				else if(s[0].charAt(0)=='b') {
					x='-';
					num=Integer.valueOf(s[1])-Integer.valueOf(s[2]);
				}
				else {
					x='*';
					num=Integer.valueOf(s[1])*Integer.valueOf(s[2]);
				}
				ss=s[1]+x+s[2]+"="+num;
			}
			else {
				if(x=='+') {
					num=Integer.valueOf(s[0])+Integer.valueOf(s[1]);
				}
				else if(x=='-') {
					num=Integer.valueOf(s[0])-Integer.valueOf(s[1]);
				}
				else {
					num=Integer.valueOf(s[0])*Integer.valueOf(s[1]);
				}
				ss=s[0]+x+s[1]+"="+num;
			}
			System.out.println(ss);
			if(i==n-1) {
				System.out.print(ss.length());
			}
			else {
				System.out.println(ss.length());
			}
		}
	}
}

(5)P5015 标题统计
很简单的一题,读入一行字符串,遍历它并计数除了空格的字符。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		int sum=0;
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)!=' ') {
				sum++;
			}
		}
		System.out.print(sum);
	}
}

(6)P5734 【深基6.例6】文字处理软件
建立一个StringBuilder来模拟文档(StringBuilder就是可变的字符串),然后根据每个命令就是相应的操作,一般语言都有自带处理字符串的函数,所以用语言自带的函数即可。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		sc.nextLine();
		StringBuilder sb=new StringBuilder(sc.nextLine());
		for(int i=0;i<n;i++) {
			String[] s=sc.nextLine().split(" ");
			if(s[0].equals("1")) {
				sb.append(s[1]);
				System.out.println(sb);
			}
			else if(s[0].equals("2")) {
				sb=new StringBuilder(sb.substring(Integer.valueOf(s[1]),Integer.valueOf(s[1])+Integer.valueOf(s[2])));
				System.out.println(sb);
			}
			else if(s[0].equals("3")) {
				sb.insert(Integer.valueOf(s[1]), s[2]);
				System.out.println(sb);
			}
			else {
				System.out.println(sb.indexOf(s[1]));
			}
		}
	}
}

(7)P1308 统计单词数
这道题是一道比较麻烦的题,如果这题它只要求输出这个单词出现的次数,那么很简单,对这个字符串扫一遍,用一个变量记录出现的位置即可。但这道题它还有第二个输出,要求输出第一次出现的位置,这个出现的位置可不好找,这也是这道题通过率很低的原因,很多人用语言自带的indexof函数来找第一次出现的位置,可是这样是错的。因为我们要求输出的是第一次这个单词出现的位置,但语言自带的indexof不管是是不是同一个单词,只要字符串匹配上了,它要输出。什么意思呢?就是说比如 我们要找ab,而有一个字符串是abc ab 那么,我们应该是找的后面的ab而不是前面的abc中的ab,所以我们要写个循环自己找第一次单词出现的位置,如果字符串匹配上了,并且它前面和后面都是空格,那么我认为这才是同一个单词,另外,特判下这个单词是第一个和最后一个的情况。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s1=sc.nextLine().toUpperCase();
		String s=sc.nextLine().toUpperCase();
		String[] s2=s.split(" ");
		int sum=0,first=-1;
		for(int i=0;i<s2.length;i++) {
			if(s1.equals(s2[i])) {
				sum++;
			}
		}
		if(sum==0) {
			System.out.println(-1);
		}
		else {
			for(int i=0;i<s.length();i++) {
				if(s.substring(i,i+s1.length()).equals(s1)&&(((i-1==-1)||s.charAt(i-1)==' ')&&((i+s1.length()==s.length())||s.charAt(i+s1.length())==' '))) {
					first=i;
					break;
				}
			}
			System.out.println(sum+" "+first);
		}
	}
}

(8)P1765 手机
很水的一题,用一个变量记录总按下的次数,然后遍历字符串,根据字母需要按几下就让变量增加相应的次数。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		int sum=0;
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)==' '||s.charAt(i)=='a'||s.charAt(i)=='d'||s.charAt(i)=='g'||s.charAt(i)=='j'||s.charAt(i)=='m'||s.charAt(i)=='p'||s.charAt(i)=='t'||s.charAt(i)=='w') {
				sum++;
			}
			else if(s.charAt(i)=='b'||s.charAt(i)=='e'||s.charAt(i)=='h'||s.charAt(i)=='k'||s.charAt(i)=='n'||s.charAt(i)=='q'||s.charAt(i)=='u'||s.charAt(i)=='x') {
				sum+=2;
			}
			else if(s.charAt(i)=='s'||s.charAt(i)=='z') {
				sum+=4;
			}
			else {
				sum+=3;
			}
		}
		System.out.println(sum);
	}
}

(9)P3741 honoka的键盘
这道题给了50个测试点,所以代码稍微有一点Bug就AC不了,一开始我是用模拟的方法,用两个变量记录v和k的数量,后面发现老是有几个点通过不了。仔细想想这道题并没有那么复杂,它只有两个字符V和K,并且至多只能改变一个字符,所以可以列出排列的情况无非是VV,KK,VK,KV,首先第一遍扫描字符串,把VK找出来并用一个数组来标记下标,第二遍扫描找看看有没有KK或者VV的情况并且 下标是没被标记过的,那么就总和再加1.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		sc.nextLine();
		int sum=0;
		StringBuilder sb=new StringBuilder(sc.nextLine());
		boolean[] arr=new boolean[sb.length()];
		for(int i=0;i<n-1;i++) {
			if(sb.charAt(i)=='V'&&sb.charAt(i+1)=='K') {
				sum++;
				arr[i]=true;
				arr[i+1]=true;
				i++;
			}
		}
		for(int i=0;i<n-1;i++) {
			if(sb.charAt(i)=='V'&&sb.charAt(i+1)=='V'&&!arr[i]&&!arr[i+1]) {
				sum++;
				break;
			}
			if(sb.charAt(i)=='K'&&sb.charAt(i+1)=='K'&&!arr[i]&&!arr[i+1]) {
				sum++;
				break;
			}
		}
		System.out.println(sum);
	}
}

(10)P1321 单词覆盖还原
这道题就是不要想太多,直接从头扫到尾,boy一次扫三个字符,如果,有一个对上了,计数加1。girl一次扫4个字符。一个对上了计数加1。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		int boy=0,girl=0;
		for(int i=0;i<s.length()-2;i++) {
			if(s.charAt(i)=='b'||s.charAt(i+1)=='o'||s.charAt(i+2)=='y') {
				boy++;
			}
		}
		for(int i=0;i<s.length()-3;i++) {
			if(s.charAt(i)=='g'||s.charAt(i+1)=='i'||s.charAt(i+2)=='r'||s.charAt(i+3)=='l') {
				girl++;
			}
		}
		System.out.println(boy);
		System.out.println(girl);
		
	}
}

(11)P1553 数字反转(升级版)
虽然有很多种格式,但其实还都是数字反转,比如小数,也就是对小数点左右两边分别翻转,所以先扫描字符串,判断它是什么类型的,然后根据特定的类型进行对应的翻转。数字翻转有两种方法,一种是当成字符串进行翻转,这样要判断前导0的情况,也可以直接利用数字的特性进行翻转,我是选择了后者,结果发现有一个测试点要用高精度才能过,所以我偷懒了对那个测试点用字符串翻转。思路不是很难,但我这次没有重构代码,所以代码写的很乱很长,听个思路就好啦。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		int flag=0,index=0;
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)=='.') {
				flag=1;
				index=i;
				break;
			}
			if(s.charAt(i)=='/') {
				flag=2;
				index=i;
				break;
			}
		}
		if(s.charAt(s.length()-1)=='%') {
			flag=3;
		}
		if(flag==0) {
				StringBuilder sb=new StringBuilder(s);
				sb=new StringBuilder(sb.reverse());
				int p=0;
				for(int i=0;i<sb.length();i++) {
					if(sb.charAt(i)=='0') {
						p++;
					}
					else {
						break;
					}
				}
				System.out.println(sb.substring(p,sb.length()));
				return;
		}
		else if(flag==1) {
			long x1=Long.valueOf(s.substring(0,index)),x2=Integer.valueOf(s.substring(index+1,s.length())),res1=0,res2=0;
			while(x1>0) {
				res1=res1*10+x1%10;
				x1/=10;
			}
			while(x2>0) {
				res2=res2*10+x2%10;
				x2/=10;
			}
			System.out.println(res1+"."+res2);
		}
		else if(flag==2) {
			long x1=Long.valueOf(s.substring(0,index)),x2=Integer.valueOf(s.substring(index+1,s.length())),res1=0,res2=0;
			while(x1>0) {
				res1=res1*10+x1%10;
				x1/=10;
			}
			while(x2>0) {
				res2=res2*10+x2%10;
				x2/=10;
			}
			System.out.println(res1+"/"+res2);
		}
		else {
			long x=Long.valueOf(s.substring(0,s.length()-1)),res=0;
			while(x>0) {
				res=res*10+x%10;
				x/=10;
			}
			System.out.println(res+"%");
		}
	}
}

(12)P1603 斯诺登的密码
利用两个数组来建立一个字符和数字的映射,然后扫描给定的字符串,把是数字的字符选出来,要使输出最小,从小到大排序后输出即可。


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

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String[] s={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty","a","both","another","first","second","third"};//对应
		int[] arr={0,1,4,9,16,25,36,49,64,81,00,21,44,69,96,25,56,89,24,61,0,1,4,1,1,4,9};
		String[] w=sc.nextLine().split(" ");
		int[] a=new int[10];
		int p=0;
		for(int i=0;i<w.length-1;i++) {
			for(int j=0;j<s.length;j++) {
				if(w[i].equals(s[j])) {
					a[p++]=arr[j];
					break;
				}
			}
		}
		Arrays.sort(a);
		StringBuilder sb=new StringBuilder();
		boolean flag=false;
		for(int i=0;i<a.length;i++) {
			if(a[i]!=0&&!flag) {
				sb.append(a[i]);
				flag=true;
			}
			else if(a[i]!=0&&a[i]<10) {
				sb.append("0"+a[i]);
			}
			else if(a[i]!=0&&a[i]>=10) {
				sb.append(a[i]);
			}
		}
		if(sb.length()==0) {
			System.out.println(0);
		}
		else
			System.out.println(sb);
		
	}
}

(13)P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
这道题就是把两个字符串各自字符之积然后取模进行比较,如果相等就输出GO,不然就输出STAY。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String a=sc.nextLine();
		String b=sc.nextLine();
		int res1=1,res2=1;
		for(int i=0;i<a.length();i++) {
			res1*=(int)(a.charAt(i)-64);
		}
		for(int i=0;i<b.length();i++) {
			res2*=(int)(b.charAt(i)-64);
		}
		if(res1%47==res2%47) {
			System.out.println("GO");
		}
		else {
			System.out.println("STAY");
		}
	}
}

(14)P1597 语句解析
规定的了3个字母,而且格式十分工整。所以直接扫描字符串赋值就好啦,这里唯一需要注意的是,可能是字母赋值给字母,最好的方法是用map存,但因为这里一共就3个字母,我为了省事就直接用if进行判断了。不过这样代码量就会比较大。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		int a=0,b=0,c=0;
		for(int i=0;i<s.length();i+=5) {
			if(s.charAt(i)=='a') {
				if(s.charAt(i+3)=='a') {
					a=a;
				}
				else if(s.charAt(i+3)=='b') {
					a=b;
				}
				else if(s.charAt(i+3)=='c') {
					a=c;
				}
				else {
					a=(int)(s.charAt(i+3)-'0');
				}
			}
			else if(s.charAt(i)=='b') {
				if(s.charAt(i+3)=='a') {
					b=a;
				}
				else if(s.charAt(i+3)=='b') {
					b=b;
				}
				else if(s.charAt(i+3)=='c') {
					b=c;
				}
				else {
					b=(int)(s.charAt(i+3)-'0');
				}
			}
			else {
				if(s.charAt(i+3)=='a') {
					c=a;
				}
				else if(s.charAt(i+3)=='b') {
					c=b;
				}
				else if(s.charAt(i+3)=='c') {
					c=c;
				}
				else {
					c=(int)(s.charAt(i+3)-'0');
				}
			}
		}
		System.out.print(a+" "+b+" "+c);
	}
}

(15)P1598 垂直柱状图
首先先用一个数组把各个字符的计数存起来, 并找出最多的字符个数,因为这决定了柱状图的高度。然后就是一遍遍的遍历这个数组,来进行打印星号了。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int[] arr=new int[26];
		for(int i=0;i<4;i++) {
			String s=sc.nextLine();
			for(int j=0;j<s.length();j++) {
				if(s.charAt(j)>='A'&&s.charAt(j)<='Z'){
					arr[(int)(s.charAt(j)-'A')]++;;
				}
			}
		}
		int max=0;
		for(int i=0;i<26;i++) {
			max=Math.max(max, arr[i]);
		}
		for(int i=max;i>0;i--) {
			for(int j=0;j<26;j++) {
				if(arr[j]>=i) {
					System.out.print("*");
				}
				else {
					System.out.print(" ");
				}
				System.out.print(" ");
			}
			System.out.println();
		}
		System.out.println("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
	}
}

发布了26 篇原创文章 · 获赞 18 · 访问量 4633

猜你喜欢

转载自blog.csdn.net/qq_43751506/article/details/104916010
今日推荐