1.不要二
题目描述:
二货小易有一个W*H的网格盒子,网格的行编号为0 ~ H-1,网格的列编号为0 ~ W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
示例:
输入:
//每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
3 2
输出:
//输出一个最多可以放的蛋糕数
4
OJ链接
解题思路:
1.由题意可得:(x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) = 4, 而在该题中相同数相乘不可能为2、 3 ,所以只可能有两种情况:0+4 = 4 , 4 +0 = 4;
2. 0+4 = 4 —>x1-x2 = 0 —>x1=x2 ,y1-y2 = 2 -->y1= y2+2
3. 4+0=4 —>y1-y2=0 —>y1=y2 ,x1-x2=2 —>x1=x2+2;
4. 可以得出[i+2][j] 或者[i][j+2] 不能放蛋糕, 所以当出现[i+2][j] 或者[i][j+2] 下标的值= 1; 遍历数组时,当值为0时就可以放入蛋糕;
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int w = sc.nextInt();
int h = sc.nextInt();
int[][] arr = new int[w][h];
int count = 0;
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
if (arr[i][j] == 0) {
count++;
//两块蛋糕的欧几里得距离不能等于2
if (i+2 < w) {
arr[i+2][j] = 1;
}
if (j+2 < h ) {
arr[i][j+2] = 1;
}
}
}
}
System.out.println(count);
}
}
2.字符串转成整数
题目描述:
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
数据范围:字符串长度满足
进阶:空间复杂度 ,时间复杂度
注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
示例:
输入:
//输入一个字符串,包括数字字母符号,可以为空
"+2147483647"
返回值:
//如果是合法的数值表达则返回该数字,否则返回0
2147483647
输入:
"1a33"
返回值:
0
OJ链接
解题思路:
1.先是输入描述中表示输入的字符串可以为空,所以要判断,当str == null或str为空,不是合法的数值表达则返回0;
2.判断第一个字符串是否为+/-,通过定义flg,为+号,则flg = 1,为-号,则flg = -1;
3.判断字符串是否是合法数字 重要:str.charAt(i) - ‘0’ 就是该数字;例如在ASCII表中0 是48,1是49,那么字符串1 - 字符串0 = 1,;
代码如下:
public class Solution {
public int StrToInt(String str) {
char[] chs = str.toCharArray();
if (chs == null ||chs.length == 0) {
return 0;
}
int flg = 1;
if (chs[0] == '+') {
flg = 1;
chs[0] = '0';//str.charAt(i)底层是一个被final修饰的value数组,不能赋值,所以可以把它变成一个数组
} else if (chs[0] == '-') {
flg =-1;
chs[0] = '0';
}
int sum = 0;
for (int i = 0; i < str.length(); i++) {
//i只能从0开始,例如1a33前面并没有+/-号,而从0开始,'+'为43,刚好小于‘0’为48,所以sum一直 = 0;所以需要改变'+'的值;
if (chs[i] < '0' ||chs[i] > '9') {
sum = 0;
break;
}
sum = sum * 10 + chs[i] - '0'; //str[i] - '0' <==>
}
return sum * flg;//如果字符串首位'-',flg为-1;如果字符串首位'+',flg为1;如果都不是,则flg= 1,不会影响原本数字;
}
}