1.
小红和小明在玩一个字符串元音游戏。
给你一个字符串 s
,小红和小明将轮流参与游戏,小红 先 开始:
- 在小红的回合,她必须移除
s
中包含 奇数 个元音的任意 非空子字符串
。 - 在小明的回合,他必须移除
s
中包含 偶数 个元音的任意 非空子字符串
。
第一个无法在其回合内进行移除操作的玩家输掉游戏。假设小红和小明都采取 最优策略 。
如果小红赢得游戏,返回 true
,否则返回 false
。
英文元音字母包括:a
, e
, i
, o
, 和 u
。
示例 1:
输入: s = "leetcoder"
输出: true
解释:
小红可以执行如下移除操作来赢得游戏:
可以执行以下操作:
返回你能执行的 最大 操作次数。
示例 1:
输入: s = "1001101"
输出: 4
解释:
- 小红先手,她可以移除加下划线的子字符串
s = "leetcoder"
,其中包含 3 个元音。结果字符串为s = "der"
。 - 小明接着,他可以移除加下划线的子字符串
s = "der"
,其中包含 0 个元音。结果字符串为s = "er"
。 - 小红再次操作,她可以移除整个字符串
s = "er"
,其中包含 1 个元音。 - 又轮到小明,由于字符串为空,无法执行移除操作,因此小红赢得游戏。
bool doesAliceWin(char* s) {
bool check(char c) {
return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}
for (int i = 0; i < strlen(s); i++) {
if (check(s[i])) {
return true;
}
}
return false;
}
如果 s 不包含任何元音,小红输。
如果 s 包含奇数个元音,小红可以直接把整个 s 移除,小红赢。
如果 s 包含正偶数个元音,由于偶数减奇数等于奇数,小红移除任意包含奇数个元音的子串后,剩余元音个数仍然为奇数。由于奇数减偶数还是奇数,所以无论小明怎么操作,仍然会剩下奇数个元音,此时小红可以直接把整个 s 移除,小红赢。 -
2.
给你一个
二进制字符串
s
。你可以对这个字符串执行 任意次 下述操作:
- 选择字符串中的任一下标
i
(i + 1 < s.length
),该下标满足s[i] == '1'
且s[i + 1] == '0'
。 - 将字符
s[i]
向 右移 直到它到达字符串的末端或另一个'1'
。例如,对于s = "010010"
,如果我们选择i = 1
,结果字符串将会是s = "000110"
。 - 选择下标
i = 0
。结果字符串为s = "0011101"
。 - 选择下标
i = 4
。结果字符串为s = "0011011"
。 - 选择下标
i = 3
。结果字符串为s = "0010111"
。 - 选择下标
i = 2
。结果字符串为s = "0001111"
。
class Solution {
public:
int maxOperations(string s) {
int ans = 0, cnt1 = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '1') {
cnt1++;
} else if (i && s[i - 1] == '1') {
ans += cnt1;
}
}
return ans;
}
};
从左到右遍历 s,同时用一个变量 cnt
维护遍历到的 1 的个数。
如果 s[i] 是 1,把 cnt 增加 1。
如果 s[i] 是 0 且 s[i−1] 是 1,意味着我们找到了一段道路,可以让 i 左边的每个0都操作一次,把答案增加 cnt
遍历结束,返回答案。
3.
给你两个 正 整数 x
和 y
,分别表示价值为 75 和 10 的硬币的数目。
Alice 和 Bob 正在玩一个游戏。每一轮中,Alice 先进行操作,Bob 后操作。每次操作中,玩家需要拿出价值 总和 为 115 的硬币。如果一名玩家无法执行此操作,那么这名玩家 输掉 游戏。
两名玩家都采取 最优 策略,请你返回游戏的赢家。
示例 1:
输入:x = 2, y = 7
输出:"Alice"
解释:
游戏一次操作后结束:
- Alice 拿走 1 枚价值为 75 的硬币和 4 枚价值为 10 的硬币。
class Solution {
public:
string losingPlayer(int x, int y) {
return min(x, y / 4) % 2 ? "Alice" : "Bob";
}
};
因为 10 的倍数不可能等于 115,所以面额为 10 的硬币不能单独选,至少要选 1 个面额为 75 的硬币。
又由于 75⋅2=150>115,所以面额为 75 的硬币要恰好选 1 个。
由于 75+10⋅4=115,所以面额为 10 的硬币要恰好选 4 个。
java总结
集合与数组的区别
长度区别数组长度固定,定义长了造成内存空间的浪费,定义短了不够用。
集合大小可以变,用多少空间拿多少空间。
内容区别
数组可以存储基本数据类型和引用数据类型
集合中能存储引用数据类型(存储的为对象的内存地址)
list.add(100);//为自动装箱,100为Integer包装的
元素区别
数组中只能存储同一种类型成员
集合中可以存储不同类型数据(一般情况下也只存储同一种类型的数据)
集合结构
在java中每一个不同的集合,底层会对应不同的数据结构。往不同的集合中
存储元素,等于将数据放到了不同的数据结构当中。什么是数据结构?数据存储的
结构就是数据结构。不同的数据结构,数据存储方式不同。单列集合 Collection
List可以重复:ArrayList/LinkedList
Set不可重复:HashSet/TreeSet
List特点:此处顺序并不是大小顺序,而是存入数据的先后顺序。有序因为List集合都有下标,下标从0开始,以递增。
Set特点:取出顺序不一定为存入顺序,另外Set集合没有下标。
ArrayList是非线程安全的。
HashSet集合在new的时候,底层实际上new了一个HashMap集合。向HashSet集合中存储元素,实际上是存储到了HashMap的key中了。HashMap集合是一个Hash表数据结构。
SortedSet集合存储元素的特点:由于继承了Set集合,所以他的特点也是无序不可重复,但是放在SortedSet集合中的元素可以自动排序。放到该集合中的元素是自动按照大小顺序排序的。
TreeSet集合底层实际上是TreeMap。TreeSet集合在new的时候,底层实际上new了一个TreeMap集合。向TreeSet集合中存储元素,实际上是存储到了TreeMap的key中了。TreeMap集合是一个二叉树数据结构。
双列集合Map:HashMap/TreeMap
-
Collection集合的的常用方法
方法名 说明
boolean add(E e) 添加元素到集合的末尾(追加)
boolean remove(Object o) 删除指定的元素,成功则返回true(底层调用equles)
void clear() 清空集合
boolean contains(Object o) 判断元素在集合中是否存在,存在则返回true(底层调用equles)
boolean isEmpty() 判断集合是否为空,空则返回true
int size() 返回集合中元素个数
代码示例
import java.util.ArrayList;
import java.util.Collection;
public class Collection_01 {
public static void main(String[] args) {
//父类的引用指向子类的对象,形成多态
Collection<String> con = new ArrayList<>();
//追加的方式添加元素
con.add("东邪");
con.add("西毒");
con.add("南帝");
con.add("北丐");
con.add("中神通");
//删除,通过元素名称删除元素
System.out.println(con.remove("西毒"));
//判断集合中是否包含指定参数元素
System.out.println(con.contains("西毒")); //false
System.out.println(con.contains("东邪")); //true
//获取集合中元素个数
System.out.println(con.size());
//判断是否为空
System.out.println(con.isEmpty());//false
//清空集合
con.clear();
//判断是否为空
System.out.println(con.isEmpty());//true
System.out.println(con);//打印集合的元素
}
}
以下迭代方式,是所有Collection通用的一种方式。在Map集合中不能使用,在所有的Collection以及子类中使用。