java基础题day06--每日两题

本文探讨了如何在二维网格中放置蛋糕,使得任意两块蛋糕的欧几里得距离不等于2,以及如何在不允许使用库函数的情况下将字符串转换为整数。在蛋糕问题中,通过遍历并更新二维数组实现了最大蛋糕数量的计算;在字符串转整数问题中,从后往前遍历字符串构建数字,并处理首位的符号。这两个算法都涉及到了有效的范围检查和条件判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

不要二__牛客网

把字符串转换成整数__牛客网





二货小易有一个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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值