283、移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
class Solution {
public void moveZeroes(int[] nums) {
int slow=0,fast=0;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
fast++;
}else {
int temp=nums[slow];
nums[slow]=nums[fast];
nums[fast]=temp;
slow++;
fast++;
}
}
}
}
290、单词规律
给定一种规律 pattern
和一个字符串 str
,判断 str
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应规律。
注意示例4
class Solution {
public boolean wordPattern(String pattern, String s) {
String[]ss=s.split(" ");//将每个单词存入数组里,一个存储空间对应一个单词
if(pattern.length()!=ss.length){
return false;
}
Map<Character,String>map=new HashMap<>();
for(int i=0;i<pattern.length();i++){
char c=pattern.charAt(i);
if(map.containsKey(c)){//如果存在键
if(!map.get(c).equals(ss[i])){//判断所对应的值是否匹配
return false;
}
}else if(!map.containsKey(c)) {//如果不存在键
if(map.containsValue(ss[i])){//判断是否有不同的键对应相同的值
return false;//eg: a-dog b-dog
}
map.put(c,ss[i]);
}
}
return true;
}
}
292、Nim 游戏
你和你的朋友,两个人一起玩 Nim 游戏:
- 桌子上有一堆石头。
- 你们轮流进行自己的回合, 你作为先手 。
- 每一回合,轮到的人拿掉 1 - 3 块石头。
- 拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n
的情况下赢得游戏。如果可以赢,返回 true
;否则,返回 false
。
法一:动态规划
要清楚dp[ i ]的意思,然后利用举例子来得到推到公式
class Solution {
public boolean canWinNim(int n) {
//只要有1种或多种取法让后手者必输,先手者就可以胜出。
if(n<=3) return true;
boolean dp[]=new boolean[n+1];//dp[i]解释为:剩余i颗石头
dp[1]=true;//剩余1颗石头,先手拿掉1块石头
dp[2]=true;//剩余2颗石头,先手拿掉2块石头
dp[3]=true;//剩余3颗石头,先手拿掉3块石头
//经过几轮后,只要剩余的石头不是为1颗或者2颗或者3颗,那么先手肯定输
for (int i = 4; i <n+1; i++) {
dp[i] = !dp[i-1] || !dp[i-2] || !dp[i-3];
}
return dp[n];
}
}
法二:数学归纳法
class Solution {
public boolean canWinNim(int n) {
return n%4!=0;
}
}