【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;
}