思路:首先将date拆分,然后提取出年月日信息即可。
class Solution {
String[] s={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
public String reformatDate(String date) {
String[] ss = date.split(" ");
StringBuilder str = new StringBuilder();
str.append(ss[2]);
str.append('-');
for (int i = 0; i < 12; i++)
if (ss[1].equals(s[i])) {
if (i + 1 < 10) str.append('0');
str.append(String.valueOf(i + 1));
break;
}
str.append('-');
int len = ss[0].length() - 2;
if(len<2) str.append('0');
str.append(ss[0].substring(0, len));
return str.toString();
}
}
思路:n只有1000这么大,直接暴力法求出所有子数组的和即可。
class Solution {
public int rangeSum(int[] nums, int n, int left, int right) {
long ans = 0;
List<Long> list = new ArrayList<>();
long[] sum = new long[n + 1];
for (int i = 1; i <= n; i++)
sum[i] = sum[i - 1] + nums[i - 1];
for (int i = 0; i <= n; i++)
for (int j = 0; j < i; j++)
list.add(sum[i] - sum[j]);
Collections.sort(list);
for (int i = left - 1; i < right; i++)
ans = (ans + list.get(i)) % 1000000007;
return (int) ans;
}
}
思路:首先要对数组排序是肯定的,你只能修改最多三个元素,而清晰的是,你修改中间元素是没有意义的,因为不会影响最大最小值的差,因此你需要修改的一定是数组边界的值,例如你将最小的数修改为第二小的数等等,我的方法是暴力修改前i个最小数和3-i个最大的数,然后取出最小值。
class Solution {
public int minDifference(int[] nums) {
if (nums.length <= 3)
return 0;
Arrays.sort(nums);
int len = nums.length;
int ans = nums[len - 1] - nums[0];
for (int i = 0; i <= 3; i++)
ans = Math.min(ans, nums[len - 1 - i] - nums[3 - i]);
return ans;
}
}
思路:对于博弈类问题来说,玩家双方当前所采取的的步骤一定是尽量让对方面临必输态。什么是必输态呢?例如n=5时,不管先手取1个还是取4个都会输,因此我们考虑从小到大遍历过去,而1个石子和2个石子我们是可以确定输赢结果的。在我的方法中dp[i]=0表示石子数量为i时玩家是必输态。
class Solution {
public boolean winnerSquareGame(int n) {
if (n <= 2)
return n == 1 ? true : false;
int[] dp = new int[n + 1];
dp[1] = 1;
for (int i = 2; i <= n; i++) {
int num = 1;
for (int j = 1; j <= (int) Math.sqrt(i); j++)
num = Math.min(num, dp[i - j * j]);
dp[i] = 1 - num;
}
return dp[n] == 1 ? true : false;
}
}