【Leecode笔记之java】第12周(11.23-11.29)字符串专题

【11.23】

第一题:生成每种字符都是奇数个的字符串

在这里插入图片描述

分析:假如给定的整数为奇数,那么直接输出n个a即可;假如给定的整数为偶数,则输出(n-1)个a,一个b即可。
这道题的可扩展性太高,可任意发挥。

//执行用时:1 ms, 在所有 Java 提交中击败了96.17% 的用户
//内存消耗:35.8 MB, 在所有 Java 提交中击败了84.92% 的用户
class Solution {
   
    public String generateTheString(int n) {
   
        char[] s = new char[n];
        if(n % 2 != 0){
   
            Arrays.fill(s,'a');
        }else{
   
            Arrays.fill(s,'a');
            s[s.length-1] = 'b';
        }
        return new String(s);
    }
}

###小葵花java课堂开课啦——Arrays###

1.void Arrays.sort()
	1)(Object[] array)
	//功能:对数组按照升序排序;
	2)(Object[] array, int from, int to)
	//功能:对数组下标为“from”到“to-1”的元素进行排序

2.Arrays.fill()
	1)(Object[] array,Object object)
	//功能:为数组元素填充相同的值object
	2)(Object[] array,int from,int to,Object object)
	//功能:为数组下标为“from”到“to-1”的元素赋值为object
	
3.Arrays.toString
	1)(Object[] array)
	//功能:返回一维数组的字符串形式
	2)Arrays.deepToString(Object[][] arrays)
	//功能:返回多维数组的字符串形式

第二题:亲密字符串

在这里插入图片描述

分析:考虑几种情况;
1.字符串长度不相等——>直接false;
2.字符串长度相等且字符串一模一样
1)每个串中有重复元素(直接将重复元素交换,相当于没有改变字符串)——>true;
2)无重复元素——>false;
3.字符串长度相等但字符串不一样
有不相等的两个地方,交换元素检查是否相等(也就是满足A[i] = B[j]&&B[i] = A[j]),相等——true;
4.其他的所有情况均为false。

//执行用时:4 ms, 在所有 Java 提交中击败了33.82% 的用户
//内存消耗:38.6 MB, 在所有 Java 提交中击败了59.43% 的用户
class Solution{
   
	public boolean buddyStrings(Strings A,Strings B){
   
		if(A.length() != B.length()) return false;
		if(A.equals(B)){
   
			int[] count = new int[26];
			for(int i = 0;i < A.length();i++){
   
				count[A.charAt(i)-'a']++;
			}
			for(int c:count)
				if(c > 1) return true;//说明有重复元素
			return false;
		}
		else{
   
			int first = -1,second = -1;
			for(int i = 0;i < A.length();i++){
   
				if(A.charAt(i) !=B.charAt(i)){
   
					if(first == -1)
						first = i;//第一处不相等
					else if(second == -1)
						second = i;//第二处不相等
					else
						return false;//两处以上不相等,返回false
				}
			}
			return (second !=-1 && A.charAt(first) == B.charAt(second) && A.charAt(second) == B.charAt(first));//两处不相等,并且两处交换相等;另外只需要判断second是因为,在已知两字符串不相等的情况下,必定有first!=-1(也就是说,必定至少一处不相等)
		}
	}
}
//执行用时:1 ms
//内存消耗:40 MB
class Solution {
   
    public boolean buddyStrings(String A, String B) {
   
        int lenA = A.length();
        int lenB = B.length();

        //如果俩字符串长度不同,或者字符串长度小于2
        if (lenA != lenB || lenA < 2 || lenB < 2)
            return false;

        //如果俩字符串相同,并且存在重复字符,返回true
        if (A.equals(B)) {
   
        //用的是哈希表,直接判断是否有重复元素即可
            HashSet<Character> set = new HashSet<>();
            for (int i = 0; i < lenA; i++) {
   
                if (set.contains(A.charAt(i)))
                    return true;
                else
                    set.add(A.charAt(i));
            }
            return false;
        }

        //如果俩字符串不同,进行判断
        int count = 0;    //计数不同的字符个数
        int pre = -1, post = -1;  //pre,post分别记录俩不同字符的位置
        for (int i = 0; i < lenA; i++) {
   
            if (count > 2) {
   
                return false;
            }
           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值