每日一题06

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,不会影响原本数字;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值