public class Solution {
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
public int aplusb(int a, int b) {
return a+b;
}
}
public int reverseInteger(int number) {
if(number>=100 && number<1000){
int a = number%10;
int b = number/10%10;
int c = number/100%10;
return a*100+b*10+c;
}
return -1;
}
public double[] calculate(int r) {
double[] a = new double[2];
a[0] = 2 * 3.14 * r;
a[1] = 3.14 * r * r;
return a;
}
public boolean canWinBash(int n) {
// Write your code here
return n%4!=0;
}
1+3=4;只要最后对方拿时,剩余石头数是4,则我方必赢,因为无论对方拿几,我方都能一次拿完;
题目变为:n能不能变为4,由此发现只要我们首次取n%4个石头,对方就会从4的倍数开始取(因为我们取走了余数,剩余一定被4整除),那么接下来,无论对方取几(1,2,3都不大于4),我们总能让对方一直处于4的倍数状态,直到获胜,
因此题目最终变为:n能否被4整除;如不能则我方获胜,如果能则我方失败;
public boolean isAlphanumeric(char c) {
// write your code here
// return Character.isLetter(c) || Character.isDigit(c);
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z')|| (c >= 'a' && c <= 'z');
}
public boolean isLeapYear(int n) {
return (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0));
}
ASCII编码表中,A=65,a=97,以此类推,每个小写字母与大写字母间隔32,所以小写字母转大写字母,直接小写字母-32就ok,大写字母转小写字母的话就+32,毕竟人家表上写的好好的,对照着用呗。
public char lowercaseToUppercase(char character) {
// write your code here
return character -= 32;
}
public int getTheMonthDays(int year, int month) {
int[] day = new int[]{
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2) {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return 29;
}
}
return day[month];
}
public int calculate(int a, char operator, int b) {
// write your code here
switch (operator) {
case '*':
return a * b;
case '/':
return a / b;
case '-':
return a - b;
default:
return a + b;
}
}
public int maxOfThreeNumbers(int num1, int num2, int num3) {
// write your code here
int a=num1>num2?num1:num2;//a为num1henum2中最大值
return a>num3?a:num3;
}
public List<String> printX(int n) {
ArrayList<String> res=new ArrayList<>();//创建一个存放String类型属性的ArrayList,名称为res
char[] line=new char[n];//创建一个长度为n的字符型数组line
for(int i=0;i<n;i++){
//外循环遍历正整数n的次数
for(int j=0;j<n;j++){
//该循环为了辅助初始化字符型数组中的每个属性
line[j]=' ';//初始化字符型数组中的每个属性
}
line[i]='X';//左边对应位置赋值"X“
line[n-i-1]='X';//右边对应位置赋值“X”
res.add(String.valueOf(line));//将得到的line转换成字符串的形式增加到ArrayList
}
return res;//返回ArrayList
}
public float maxOfArray(float[] A) {
// write your code here
float max = A[0];
for(int i = 0;i < A.length;i++){
if(max < A[i]){
max = A[i];
}
}
return max;
}
public List<Integer> generate(int size) {
// write your code here
List<Integer> list = new ArrayList<>(size);
for(int i = 0;i < size;i++){
list.add(i+1);
}
return list;
}
算法:双指针
算法思路
使用两个指针right和left,left为新数组的指针,right为原数组的指针,原数组指针向后扫,遇到非0的数就赋值给新数组的指针位置,并将新数组指针向后移动
代码思路
将两个指针先指向0,即数组头部
right向后扫描,当遇到非0数即nums[right] != 0时,将其赋值给新数组指针指向的位置,即nums[left] = nums[right],并将left向后移动一位
若新数组指针还未指向尾部,即剩余的位置都是0,将剩余数组赋值为0
复杂度分析
N表示数组nums长度
空间复杂度:O(1)
时间复杂度:O(N)
public void moveZeroes(int[] nums) {
//将两个指针先指向数组头部
int left = 0, right = 0;
while (right < nums.length) {
// 遇到非0数赋值给新数组指针指向的位置
if (nums[right] != 0) {
nums[left] = nums[right];
// 将left向后移动一位
left++;
}
right++;
}
// 若新数组指针还未指向尾部,将剩余数组赋值为0
while (left < nums.length) {
nums[left] = 0;
left++;
}
}
public int maxNum(List<Integer> nums) {
// write your code here
int max = nums.get(0);
for(int num : nums){
if(num > max){
max = num;
}
}
return max;
}