面试题 01.01. 判定字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false
示例 2:
输入: s = "abc"
输出: true
限制:
0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。
题解思路1(位运算的方式)
第一步:先把字符串中每个字符转换为一个二进制数。
转换的方式为1向左n为的位运算,n为这个字符和字符“a”之间的距离
例如 na = 0,nb=1,nc = 2...
a = 1<<0 = 1 ,b = 1<<1 = 10, c = 1<<2 = 100..;
所以,每个字符串对应位置为1;
第二步:这种情况下,如果当前字符如果曾经出现过,也就是其中某一位对应位数的值为1,就意味着曾经出现,返回False;
否则,如果没有出现过,那么通过或(“|”)运算,把这一位的值改写为1;
例如 'abca' : a= 1,b=10,c=100,前三次结果mark为111,最后一次111与001有相同符合条件,返回False
代码实现
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String astr = scanner.next();
System.out.println(isUnique(astr));
}
public static boolean isUnique(String astr) {
int aa = 0;
int cc = 1;
for (int i = 0; i < astr.length(); i++) {
char t = astr.charAt(i);
int offset = t - 'a';
int bb = cc << offset;
if ((aa & bb) != 0) {
return false;
}
aa |= bb;
}
return true;
}
}
面试题 01.02. 判定是否互为字符重排
题目描述
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明
0 <= len(s1) <= 100
0 <= len(s2) <= 100
解题思路
两个hashmap 存 两个字符串,然后判断map中value值是否相等
import java.util.HashMap;
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s1 = scanner.next();
String s2 = scanner.next();
System.out.println(CheckPermutation(s1, s2));
}
public static boolean CheckPermutation(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
HashMap<Character, Integer> map1 = new HashMap<>();
HashMap<Character, Integer> map2 = new HashMap<>();
char[] arr = s1.toCharArray();
for (int i = 0; i < arr.length; i++) {
map1.put(arr[i], map1.getOrDefault(arr[i], 0) + 1);
}
char[] arr1 = s2.toCharArray();
for (int i = 0; i < arr1.length; i++) {
map2.put(arr1[i], map2.getOrDefault(arr1[i], 0) + 1);
}
for (int i = 0; i < arr.length; i++) {
if (map1.get(arr[i]) != map2.get(arr[i])) {
return false;
}
}
return true;
}
}