面试题 01.01. 判定字符是否唯一
题目
代码
class Solution {
public boolean isUnique(String astr) {
// 使用set去重,之后返回size与string中的长度进行比较
// Set<Character> set=new HashSet<>();
// for(int i=0;i<astr.length();i++){
// set.add(astr.charAt(i));
// }
// return set.size()==astr.length();
}
}
# class Solution:
# def isUnique(self, astr: str) -> bool:
# 使用set去重
# s=set(astr)
# return len(s)==len(astr)
使用位运算(因为对于字符串可以用26个二进制数字表示,类似one—hot值)
mask=0
for s in astr:
# move为当前字符与a之间的距离,之后再左平移一位就可以当成26中的该字符位置
move=ord(s)-ord('a')
# 对于未出现过的字符s与mask做&运算结果为0,因为mask中代表该字符的位置处为0
if mask & (1<<move)==0:
# 对于未出现的字符,对其做|或运算,将代表该位置的数字改为1
mask|=(1<<move)
else:
return False
return True
面试题 01.02. 判定是否互为字符重排
题目
代码
class Solution {
public boolean CheckPermutation(String s1, String s2) {
// 注意因为字符的ascII码最大为z的122,所以128维度数组可以按ascII码存所有的字符
// 使用一个128维度的数组计数值,遍历第一个字符串,出现某个字符按其ascII码加一操作,同时对于第二个数组按其字符ascII码值进行减一操作
// 最后遍历128维度的数组,如果均为0则返回True,否则返回false
int i=s1.length(),j=s2.length();
if(i!=j) return false;
int[] arr=new int[128];
for(int a=0;a<i;a++){
arr[s1.charAt(a)]++;
arr[s2.charAt(a)]--;
}
for(int k=0;k<128;k++){
if(arr[k]!=0)
return false;
}
return true;
}
}
class Solution:
def CheckPermutation(self, s1: str, s2: str) -> bool:
# 1.使用排序后比较
# return sorted(s1)==sorted(s2)
# 2.使用两个哈希表存储
i,j=len(s1),len(s2)
if i!=j: return False
mp={}
for k in s1:
if k in mp:
mp[k]=mp[k]+1
else:
mp[k]=1
for a in s2:
if a in mp:
mp[a]=mp[a]-1
else:
mp[a]=-1
for l in mp.values():
if l!=0:return False
return True
面试题 01.03. URL化
题目
代码
class Solution {
public String replaceSpaces(String S, int length) {
char[] s = S.toCharArray();
int j = S.length() - 1;
for (int i=length-1; i>=0; i--) {
if (s[i] == ' ') {
s[j--] = '0';
s[j--] = '2';
s[j--] = '%';
}
}
return String.valueOf(s, j+1, S.length()-j-1);
}
}
class Solution:
def replaceSpaces(self, S: str, length: int) -> str:
return S[:length].replace(" ","%20")