判定字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false
示例 2:
输入: s = "abc"
输出: true
限制:
0 <= len(s) <= 100
s[i]仅包含小写字母
如果你不使用额外的数据结构,会很加分。
之前一直使用的是c++,现在开始java
对于这道题我的思路很多首先想到的是直接两重循环,直接暴力不用考虑类型,然后是用标记,用数组标记,由于是字母,ASCII码不超过128。也可以使用位运算来实现,不过在这之使用了|=
标记当前位置有这个字母。当然也可用数据结构中的,HashSet,set等利用去重机制,判断是否有重复。
import java.io.Serializable;
class Solution {
public boolean isUnique(String astr) {
// 数组做
// 因为字母编号不超过128 用数组做
/**
charAt:方法返回指定索引处的char值
int[] arr = new int[128];
for(int i = 0;i < astr.length();i ++)
{
if(arr[astr.charAt(i)]!=0){
return false;
}
arr[astr.charAt(i)]++;
}
return true;
*/
/**
位运算
long类型是64位,大写字母'A'的ASCII码是65,小写字母'z'的ASCII码是122,
两者相差58(122-65+1=58,加1是因为这里要包含大写字母'A'),是小于64的。
|=:运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
*/
long bits = 0;
int size = astr.length();
for (int i = 0; i < size; i++) {
int move = astr.charAt(i) - 'A';
// System.out.println(move);
if ((bits & (1L << move)) != 0) {
//有重复的,直接返回false,加一
// System.out.println(bits +"/n");
return false;
} else {
//标记当前位置有这个字符
bits |= (1L << move);
}
}
return true;
}
}
判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
首先,想到的是直接利用排序做,利用Arrays中的sort。
class Solution {
public boolean CheckPermutation(String s1, String s2) {
if(s1.length()!=s2.length()){
return false;
}
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
Arrays.sort(arr1);
Arrays.sort(arr2);
return Arrays.equals(arr1,arr2);
}
}
利用上一道题的思想。
class Solution {
public boolean CheckPermutation(String s1, String s2) {
if(s1.length()!=s2.length()){
return false;
}
int[] table = new int[26];
for(int i = 0;i < s1.length();i ++){
table[s1.charAt(i) - 'a'] ++;
}
for(int i = 0;i < s2.length();i ++){
table[s2.charAt(i) - 'a'] --;
if(table[s2.charAt(i) - 'a'] < 0){
return false;
}
}
return true;
}
}
每日一题 2022.8.1
生成每种字符都是奇数个的字符串
给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现 奇数次 。
返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。
示例 1:
输入:n = 4
输出:"pppz"
解释:"pppz" 是一个满足题目要求的字符串,因为 'p' 出现 3 次,且 'z' 出现 1 次。当然,还有很多其他字符串也满足题目要求,比如:"ohhh" 和 "love"。
示例 2:
输入:n = 2
输出:"xy"
解释:"xy" 是一个满足题目要求的字符串,因为 'x' 和 'y' 各出现 1 次。当然,还有很多其他字符串也满足题目要求,比如:"ag" 和 "ur"。
示例 3:
输入:n = 7
输出:"holasss"
提示:
1 <= n <= 500
解:
class Solution {
public String generateTheString(int n) {
StringBuffer ss = new StringBuffer();
if (n % 2 == 1) {
return ss.append("a".repeat(n)).toString();
}
return ss.append("a".repeat(n - 1)).append("b").toString();
}
}
- StringBuffer
可以把任意类型添加到字符串缓冲区里面,并返回字符串缓冲区本身
可变的String
StringBuffer a=new StringBuffer("abc");
a.append("b");
题目来源力扣 https://leetcode.cn/