【蓝桥杯-筑基篇】字符串基础

🍓系列专栏:蓝桥杯

🍉个人主页:个人主页

目录

🍍1.输入身份证,判断性别🍍

🍍2.输入英语句子,统计单词个数🍍

🥝3.加密解密🥝

🌎4.相邻重复子串🌎

🍮 5.周期串系列解法🍮

①数学思维

②API

🍪6.前缀和🍪


🍍1.输入身份证,判断性别🍍

分析:判断性别,只需要判断 倒数第2的奇偶就行

🍭方法1:String.charAt(  )

	    public static void main(String[] args) {
	    	Scanner scanner=new Scanner(System.in);
	    	String idCard=scanner.next();
	        char sex=idCard.charAt(16);
	        if(sex=='1'||sex=='3'||sex=='5'||sex=='7'||sex=='9') {
	        	System.out.println("男孩");
	        }
	        else System.out.println("女孩");
	       
	}

 需要注意:String.charAt(  ) 是得到的是char类型,进行判断时 需要对数字打单引号。

 🍭方法2:char-'0'  可以变成整型

	    public static void main(String[] args) {
	    	Scanner scanner=new Scanner(System.in);
	    	String idCard=scanner.next();
	        int sex=idCard.charAt(16)-'0';
	        if(sex==1||sex==3||sex==5||sex==7||sex==9) {
	        	System.out.println("男孩");
	        }
	        else System.out.println("女孩");
	       
	}

🍭方法3:

public String substring(int beginIndex, int endIndex)

第一个参数int为开始的索引,对应String数字中的开始位置,

第二个参数是截止的索引位置,对应String中的结束位置

Integer.valueOf()    :

Integer. valueOf()可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,String如果为Null或“”都会报错。

int sex=Integer.valueOf(idCard.substring(16, 17));

 🍭方法4:

1、 indexOf(String str):

返回指定字符str在字符串中(方法调用者)第一次出现处的起始索引,如果此字符串中没有这样的字符,则返回 -1。


2、indexOf(String str, int index):

返回从 index 位置开始查找指定字符str在字符串中第一次出现处的起始索引,如果此字符串中没有这样的字符,则返回 -1

	    	String sex=idCard.substring(16, 17);
	    	System.out.println("13579".indexOf(sex)==-1?"女孩":"男孩");

 🍭方法5:String.contains(String str)

该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。

	    	String sex=idCard.substring(16, 17);
	  
	    	System.out.println("13579".contains(sex)?"男孩":"女孩");


🍍2.输入英语句子,统计单词个数🍍

输入一串英语句子,统计单词的个数。

输入:good good study day day up

输出:6

分析:因为句子中间有空格,可以用  Sting.split(" ")  去除空格

	    public static void main(String[] args) {
	    	Scanner scanner=new Scanner(System.in);
	    	String words=scanner.nextLine();
	    	String arr[]=words.split(" ");
	       // System.out.println(Arrays.toString(arr));
	        System.out.println(arr.length);

	}

 当输入的英语句子中,每个单词之间有多个空格时,就会出现以下情况:

可以用   Sting.split(" +")  来实现去除多个空格:

🥝3.加密解密🥝

题目: a-z进行加密,把每个字符统一 +3 得到密文,请根据密文求出原来的明文(空格和标点符
号请忽略,只考虑小写) 

明文:abcdgh adoaj qdjiak

密文:defgjk dgrdm tgmldn

	    public static void main(String[] args) {
	    String	ming="abcdefghijklmnopqrstuvwxyz";
	    String	miwe="defghijklmnopqrstuvwxyzabc";
	    Scanner scanner=new Scanner(System.in);
	    String	str= scanner.nextLine().toLowerCase();
	
	    int number;
	    for (int i = 0; i < str.length(); i++) {
	    	char x=str.charAt(i);
	    	if(x>='a'&& x<='z') {
	    		number=ming.indexOf(x);
		    	System.out.print(miwe.substring(number,number+1));
	    	}
	    	else System.out.print(x);
	    	
	    	
		}
	

	}

🌎4.相邻重复子串🌎

题目描述:

如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”。

例如:abcd 是  “困难的串”,abcabc 是“容易的串”, a  是  “困难的串”,cabacab 是  “困难的串”

输入:cabacab   输出:false

输入:abcabcde   输出:true

代码:

public class A {

	    public static void main(String[] args) {
	    Scanner scanner=new Scanner(System.in);
	    String str=scanner.nextLine();
	    System.out.println(isEasy(str));
	}
		private static boolean isEasy(String str) {
			
			for (int len = 2; len <= str.length(); len=len+2) {
				
				for (int i = 0; i <= str.length()-len; i++) {
					String sub=str.substring(i,len+i);
					String left=sub.substring(0,len/2);
					String right=sub.substring(len/2,len);
					if(left.equals(right)) {
						return true;
					}
							
				}
				
			}
			
	
			return false;
		}

	

    
}


 

🍮 5.周期串系列解法🍮

如果一个字符可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。
 例如:abcabcabcabc 以3为周期(注意:它也以6和12为周期)
输入一个长度不超过80的字符串,输出其最小周期。

①数学思维

如果 s[j]  不等于  s[j%t]   则说明t不是周期

public class A {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String words = scanner.next();
            int period = zqc1(words);
            System.out.println(period);
        }
    }

    private static int zqc1(String words) {
        char s[] = words.toCharArray();
        int t = 1;
        for (t = 1; t < s.length; t++) {
            boolean isok = true;
            for (int start = t; start < s.length; start++) {
                if (s[start] != s[start % t]) {
                    isok = false;
                    break;
                }
            }
            if (isok) {
                return t;
            }
        }
        return s.length;
    }
}
aaa
1
asas
2
adasasd
7
abcabcabcabc
3

②API

程序定义了一个名为zqc2的私有静态方法,该方法接受一个字符串作为参数,并返回该字符串中最短重复子串的长度。该方法使用一个for循环来遍历字符串中的所有可能的子串。对于每个子串,该方法使用replace方法将该子串替换为空字符串,并检查结果字符串的长度是否为零。如果是,则说明该子串是重复的,该方法返回该子串的长度。如果没有找到重复的子串,则该方法返回字符串的长度。

public class A {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String words = scanner.next();
            int period = zqc2(words);
            System.out.println(period);
        }
    }

    private static int zqc2(String words) {
    	for (int len = 1; len < words.length(); len++) {
    		String sub = words.substring(0,len);
    		if(words.replace(sub, "").length()==0) {
    			return len;
    		}
    		

		}
	
		return words.length();
    	
   
    }
}

🍪6.前缀和🍪

详情请看这篇文章:前缀和

public class A {
    public static void main(String[] args) {
    	    int arr[]=new int[11];
    	    for (int i = 1; i < arr.length; i++) {
				arr[i]=(int)Math.pow(2, i-1);
			}
    	    System.out.println(Arrays.toString(arr));
   
    	    int[] prefix = new int[arr.length];
    	  
    	    for (int i = 1; i < arr.length; i++) {
    	        prefix[i] = prefix[i-1] + arr[i];
    	    }
    	    System.out.println(Arrays.toString(prefix));
    	    
    	    System.out.println("a3+a4+a5+a6:"+(prefix[6]-prefix[3-1]));
    	    System.out.println("a1+a2+.....+a10:"+(prefix[10]-prefix[1-1]));	
     
    }


}
[0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
[0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023]
a3+a4+a5+a6:60
a1+a2+.....+a10:1023

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱编程的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值