来源:题库 - 力扣 (LeetCode) (leetcode-cn.com)。侵删。
小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?
输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
示例1:
输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了。
示例2:
输入:guess = [2,2,3], answer = [3,2,1]
输出:1
解释:小A 只猜对了第二次。
限制:
guess
的长度 = 3answer
的长度 = 3guess
的元素取值为 {1, 2, 3}
之一。answer
的元素取值为 {1, 2, 3}
之一。class Solution {
public int game(int[] guess, int[] answer) {
// int i = 0;
// for(int j=0; j
// if(guess[j] == answer[j]){
// i++;
// }
// }
// if(guess[0] == answer[0]){
// i++;
// }
// if(guess[1] == answer[1]){
// i++;
// }
// if(guess[2] == answer[2]){
// i++;
// }
// return i;
return (guess[0]==answer[0]?1:0)+(guess[1]==answer[1]?1:0)+(guess[2]==answer[2]?1:0);
}
}
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
示例1:
输入: J = "aA", S = "aAAbbbb"
输出: 3
示例2:
输入: J = "z", S = "ZZ"
输出: 0
注意:
S
和 J
最多含有50个字母。J
中的字符不重复。class Solution {
public int numJewelsInStones(String J, String S) {
int n = 0;
for(int i=0; i<S.length(); i++){
for(int k=0; k<J.length(); k++){
if(S.charAt(i) == J.charAt(k)){
n++;
break;
}
}
}
return n;
}
}
方法一:暴力法
class Solution {
public int numJewelsInStones(String J, String S) {
int ans = 0;
for (char s: S.toCharArray()) // For each stone...
for (char j: J.toCharArray()) // For each jewel...
if (j == s) {
// If the stone is a jewel...
ans++;
break; // Stop searching whether this stone 's' is a jewel
}
return ans;
}
}
复杂度分析
时间复杂度:O(J.length * S.length))。
空间复杂度:在 Python 实现中,空间复杂度为 O(1)。在 Java 实现中,空间复杂度为 O(J.length * S.length))。
方法二:哈希集合
使用哈希表,使用 2 个独立的 for 循环,第一个对 S 中的各个字母重复的数量进行统计,并放入哈希表中。第二个 for 循环,对 J 中字母进行循环,与哈希表中的 KEY 值匹配,得到结果并进行叠加。
class Solution {
public int numJewelsInStones(String J, String S) {
Set<Character> Jset = new HashSet();
for (char j: J.toCharArray())
Jset.add(j);
int ans = 0;
for (char s: S.toCharArray())
if (Jset.contains(s))
ans++;
return ans;
}
}
复杂度分析
时间复杂度:O(J.length + S.length))。O(J.length}) 这部分来自于创建 J,O(S.length)这部分来自于搜索 S。
空间复杂度:O(J.length)。
方法三:更高的空间性能
class Solution {
public int numJewelsInStones(String J, String S) {
if (S == null || S.isEmpty()) return 0;
if (J == null || J.isEmpty()) return 0;
byte[] arr = new byte[58]; // ASCII码中字母的跨度为65-122
int count = 0;
for (char ch : J.toCharArray()) {
arr[ch - 65] = 1; // 将字符对应数组位置上的值设为1
}
for (char ch : S.toCharArray()) {
if(arr[ch -65] == 1) {
// 判断该字符在数组对应位置上的值是否为1
count++;
};
}
return count;
}
}
给你一个非负整数 num
,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
示例 1:
输入:num = 14
输出:6
解释:
步骤 1) 14 是偶数,除以 2 得到 7 。
步骤 2) 7 是奇数,减 1 得到 6 。
步骤 3) 6 是偶数,除以 2 得到 3 。
步骤 4) 3 是奇数,减 1 得到 2 。
步骤 5) 2 是偶数,除以 2 得到 1 。
步骤 6) 1 是奇数,减 1 得到 0 。
示例2:
输入:num = 8
输出:4
解释:
步骤 1) 8 是偶数,除以 2 得到 4 。
步骤 2) 4 是偶数,除以 2 得到 2 。
步骤 3) 2 是偶数,除以 2 得到 1 。
步骤 4) 1 是奇数,减 1 得到 0 。
示例 3:
输入:num = 123
输出:12
提示:
0 <= num <= 10^6
class Solution {
public int numberOfSteps (int num) {
int n = 0;
while(num!=0){
n++;
if(num%2 == 0){
num /= 2;
}else if(--num == 0){
break;
}
}
return n;
}
}
class Solution {
public int numberOfSteps (int num) {
int n = 0;
while(num!=0){
n++;
if(num%2 == 0){
num /= 2;
}else if(--num == 0){
break;
}
}
return n;
}
}
给你一个整数 n
,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
示例1:
输入:n = 234
输出:15
解释:
各位数之积 = 2 * 3 * 4 = 24
各位数之和 = 2 + 3 + 4 = 9
结果 = 24 - 9 = 15
示例 2:
输入:n = 4421
输出:21
解释:
各位数之积 = 4 * 4 * 2 * 1 = 32
各位数之和 = 4 + 4 + 2 + 1 = 11
结果 = 32 - 11 = 21
提示:
1 <= n <= 10^5
class Solution {
public int subtractProductAndSum(int n) {
String s = String.valueOf(n); // 将int转换成String
int ji = 1, he = 0;
for(char ch : s.toCharArray()){
// 遍历字符串的字符
ji *= (int)(ch - '0');
he += (int)(ch - '0'); // ch - '0'再强转成整型
}
return ji - he;
}
}
没有Java的题解。很多都是取余、除这样子的。
给你一个有效的 IPv4 地址 address
,返回这个 IP 地址的无效化版本。
所谓无效化 IP 地址,其实就是用 "[.]"
代替了每个 "."
。
示例1:
输入:address = "1.1.1.1"
输出:"1[.]1[.]1[.]1"
示例 2:
输入:address = "255.100.50.0"
输出:"255[.]100[.]50[.]0"
提示:
address
是一个有效的 IPv4 地址class Solution {
public String defangIPaddr(String address) {
String[] four = address.split("\\."); // split 参数就是正则表达式,这里用\\.来转义这个.
return String.join("[.]", four);
}
}
class Solution {
public String defangIPaddr(String address) {
return address.replace(".", "[.]"); // 替换所有字符串或字符
}
}
这里的replace不同于正则表达式的replaceAll,所以不需要转义.