目录
二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
思路:就是一个二维数组,0代表能放,1代表不能放,根据欧几里得可知:其实就是
//001100
//001100
//110011
这个样子,然后从头开始遍历,遇到0,那就蛋糕数(count)加1,并让该位置右边第二个赋值为1,和该位置向下第二个赋值为1,直到遍历结束。
实现
import java.util.Scanner;
//001100
//001100
//110011
public class Main{
//0代表蛋糕,1代表不能放
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int[][] arr = new int[m][n];//默认值都为0
int count = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; ++j){
if(arr[i][j] == 0){
count++;
//根据那个公式:
//在放蛋糕的右边第二个不能放
if(j + 2 < n){
arr[i][j + 2] = 1;
}
//在放蛋糕的下边第二个不能放
if(i + 2 < m){
arr[i + 2][j] = 1;
}
}
}
}
System.out.println(count);
}
}
把字符串转换成整数__牛客网
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
空间复杂度 O(1) ,时间复杂度 O(n)
注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
思路:
a.从后往前遍历字符串(原因是:1.为了构建最终的结果,2.为了最后判断首位置的+-问题)
b.遍历的时候构建数字,并判断每个字符是否是数字字符,
c.判断首字符
遇到的问题:刚开始没考虑字符串为空的情况.....
核心代码:isNum()方法用来判断是否是字符1-9,ret是构建最终数字结果
for(int i = str.length() - 1; i > 0; --i){
if(!isNum(str.charAt(i))){
return 0;
}else{
//构建数字
ret += (str.charAt(i) - '0')*(int)Math.pow(10,count++);
}
}
实现
public class Solution {
//时间复杂度O(1),空间复杂度O(N)-->可以使用str.charAt()来降低空间复杂度
public int StrToInt(String str) {
//字符串长度可能为0
if(str.equals("")){
return 0;
}
//从尾部进行判断并构建数字
int ret = 0;
int count = 0;
//核心代码
for(int i = str.length() - 1; i > 0; --i){
if(!isNum(str.charAt(i))){
return 0;
}else{
//构建数字
ret += (str.charAt(i) - '0')*(int)Math.pow(10,count++);
}
}
//此时判断首位
if(isNum(str.charAt(0)) || str.charAt(0) == '-' || str.charAt(0) == '+'){
if(str.charAt(0) == '+')
return ret;
else if(str.charAt(0) == '-')
return ret = -ret;
else
return ret += (str.charAt(0) - '0')*(int)Math.pow(10,count++);
//此时首位不是+-数字
}else{
return 0;//不是数字
}
}
public static boolean isNum(char ch){
if(ch >= 48 && ch <= 57){
return true;
}
return false;
}
}