每日一练刷题刷刷刷

引言:

😋大家好我是青花瓷,我们在学习知识的同时,也不能不去刷题,刷题不仅能够提高我们对知识对代码的掌握,更能在以后笔试中,运筹帷幄,决胜千里,今天开始,我将每天为大家分享每日一题,大家一起学习,如果喜欢文章的朋友记得点赞,收藏,如果觉得博主写的不错,不要忘记关注博主哦,你们的关注就是对博主最大的支持!
在这里插入图片描述

🚩字符串转化成整数

牛客地址:

https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&&tqId=11202&rp=6&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

题目:
在这里插入图片描述
在这里插入图片描述
代码:

public class Solution {
    public int StrToInt(String str) {
        char[] ch = str.toCharArray();//字符串转化为数组
        int flg = 1;//用来标志,等会来判断'-''+'
        if(str.isEmpty()) {
            return 0;
        }
        if(ch[0] == '-') {
            flg = -1;
            ch[0] = '0';//这里是字符'0',不是0
        }
        if(ch[0] == '+') {
            flg = 1;
            ch[0] = '0';
        }
        int sum = 0;//记录*整数
        for(int i = 0;i < ch.length; i++) {
            //如果123中包含其他字符如 1abc,返回0
            if(ch[i] < '0' || ch[i] > '9') {
                sum = 0;//返回0
                break;
            }
            //'1' - '0' = 1;
            sum = sum*10 + ch[i] - '0';
        }
        return flg*sum;
    }
}

🚩不要二

牛客地址:

https://www.nowcoder.com/practice/1183548cd48446b38da501e58d5944eb?tpId=85&&tqId=29840&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

题目:

在这里插入图片描述

思路:

本题的重点是要读懂题意,并且需要多读两遍,才能读懂,本题本质就是在二维数组中每个坐标去放蛋糕,一
个坐标位置放了蛋糕,跟他欧几里得距离为2的位置不能放蛋糕,这个就是关键点。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 。
也就是说:如果(x1,y1)放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4的(x2,y2)不能放蛋糕。
仔细分析前三个表达式是不可能的,因为(x1-x2) * (x1-x2)表达式结果不能等于2或3。
也就是说( (x1-x2) * (x1-x2) 和(y1-y2) * (y1-y2) )两个表达式一个等于0,一个等于4.
可以看出:假设放蛋糕的位置是(x1,y1),则不能放蛋糕的位置(x2,y2),满足x1x2,y1-y22或者x1-x22,y1y2.
仔细读理解了上面的题目解读,本题就非常简单了,定义一个二维数组,resize开空间并初始化,每个位置初始化为0,表示当蛋糕,a[i][j]位置放蛋糕,则可以标记处a[i][j+2]和a[i+1][j]位置不能放蛋糕,遍历一遍二维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。
在这里插入图片描述

上代码:

mport java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int W = in.nextInt();
        int H = in.nextInt();
        int count = 0;//记录放蛋糕的个数
        int[][] array = new int[W][H];
        for(int i = 0;i < W;i++) {
            for(int j = 0;j < H;j++) {
         //array[i][j] == 0的位置为可以放
         //array[i+2][j] == 1 || array[i][j+2] ==1 不可放
                if(array[i][j] == 0) {
                    count++;
                    if(i+2 < W) {
                        //不可以放的位置标志出来
                        array[i+2][j] = 1;
                    }
                    if(j+2 < H) {
                        array[i][j+2] = 1;
                    }
                }
            }
        }
        System.out.println(count);
    }
}

🚩统计回文

牛客地址:

https://www.nowcoder.com/practice/9d1559511b3849deaa71b576fa7009dc?tpId=85&&tqId=29842&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

题目:
在这里插入图片描述
在这里插入图片描述

做这道题之前我们需要明白什么是回文串;
什么是回文字符串,题目里面说就是一个正读和反读都一样的字符串 ,回文串也就是前后对称的字符串。本题是判断是否是回文串的变形题。字符串本身不一定是回文,把第二个字符串插入进去看是否是回文。比如 abba acca

思路:

本题使用暴力求解方式计算即可,遍历str1,将str2 insert进入str1的每个位置,判断是否是回文,这里注意的是,判断回文的时候,直接将字符串逆置,看是否相同就好了。是就count++;需要注意的是这里不能str1.insert(i, str2),这样的话str1改变了,判断下一个位置就不对了。所以每次使用str1重新给一个str,然后str.insert(i, str2),再判断。

上代码:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str1 = scan.nextLine();//A
        String str2 = scan.nextLine();//B
        int count = 0;//记录回文个数
        //这里注意插入条件(i可以在插在最后)
        for(int i = 0; i  <= str1.length();i++){
            StringBuffer str = new StringBuffer(str1);
            str.insert(i,str2);
            //将str逆置 判断是否回文
            //这里注意用 tmp 暂存 str,因为调用reverse方法
            //会将 tmp也 逆置
            StringBuffer tmp = new StringBuffer(str);
            StringBuffer str5 =  tmp.reverse();
            if(str5.toString().equals(str.toString())) {
                count++;
            }
        }
       System.out.println(count);
    }
}


自己写的笔记(稍微有那么一些简陋~~~🤣)
在这里插入图片描述

这个怎么调整方向呢?求告知------

🚩连续最大和(动态规划)

牛客地址:

https://www.nowcoder.com/practice/5a304c109a544aef9b583dce23f5f5db?tpId=85&&tqId=29858&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

题目:
在这里插入图片描述
思路:

状态方程式: max( dp[ i ] ) = getMax( max( dp[ i -1 ] ) + arr[ i ] ,arr[ i ] )
dp[i] 就是以数组下标为 i 的数做为结尾的最大子序列和,注意是以 i 为结尾,比如说现在有一个数组
{6,-3,-2,7,-15,1,2,2},dp[2]就是以-2为结尾的,那么显然dp[3]的最大值就是1咯(6,-3,-2),dp[3]要以7结尾那么以7结尾的子序列最大和就是8(6,-3,-2,7)。现在我们开始细细品一下上面这个递推式,求dp[i]的时候是不是有两种可能,要么就是像上面的dp[3]一样,dp[2]求出来是1了,再加上自己array[3]是最大的,那么还有一种可能就是说如果dp[2]我求出来是-100,那如果我也是dp[2]+array[3]的话是-93, 这时候dp[2]反而是累赘,最大就是自己(因为前面定义了必须以i为结尾,也就说必须以7结尾)。

来个笔记便于大家理解—
请添加图片描述
—博主有点懒,这里就不给大家画图了,我相信我的笔记大家一定能够看懂,日后有什么好的建议,多多提出哟~👀

上代码:

import java.util.Scanner;
public class Main {
    public static int GetMax(int a,int b) {
        return a > b ? a : b;
    }
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int size = s.nextInt();
        int[] array = new int[size];
        for(int i = 0;i < size; i++) {
            array[i] = s.nextInt();
        }
        int sum = array[0];
        int max = array[0];
        for(int i = 0;i < size;i ++) {
            sum = GetMax(sum + array[i],array[i]);
                if(sum >= max) {
                    max = sum;
                }
        }
        System.out.println(max);
    }
}

第一次给大家分享每日一题,有许多地方写的不好,希望大家能够多多提供建议哟!,以后的每日一天不会水的哈

🚩计算糖果

牛客地址:

https://www.nowcoder.com/practice/02d8d42b197646a5bbd0a98785bb3a34?tpId=85&&tqId=29857&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

题目:
在这里插入图片描述
思路:

1.A - B = a 2.B - C = b 3.A + B = c 4.B + C = d 这道题目的实质是:判断三元一次方程组是否有解及求解, 这里是小学生都会的问题了^^ 1+3可以得到A=(a+c)/2;4-2可以得到C=(d-b)/2;
2+4可以得到B2=(b+d)/2,3-1可以得到B1=(c-a)/2;
如果B1不等B2则表达式无解

上代码:

import java.util.*;
public class Main {
    public  static void main (String[] args) {
        Scanner in = new Scanner(System.in);
        int a = in.nextInt();//A-B
        int b = in.nextInt();//B-C
        int c = in.nextInt();//A+B
        int d = in.nextInt();//B+C
        //计算A,B,C的值
        int A = (a+c)/2;
        int C = (d-b)/2;
        //这里c-a可以得到B b+d 也能得到B 
        //所以这里有两个B 要进行判断
        int B1 = (b+d)/2;
        int B2 = (c-a)/2;
        //如果B1不等于B2说明不存在这样的数
        if(B1 != B2) {
            System.out.print("No");
        }else{
            System.out.print(A+" " +B2 + " " +C);
        }
    }
}


🚩进制转换

牛客地址:

https://www.nowcoder.com/practice/ac61207721a34b74b06597fe6eb67c52?tpId=85&&tqId=29862&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

题目:
在这里插入图片描述

思路:

本题思路很简单,首先想清楚原理:N进制数,每个进制位的值分别是X0N0X1*N1, X2N^2…,X0,X1,X2就是这些进制位的值,就是就是进行取模余数就是当前低进制的位的值是多少,通过除掉进制数,进入下一个进制位的计算。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();
        boolean flg = false;
        String table = "0123456789ABCDEF";
        StringBuffer ret = new StringBuffer();
        if(m < 0) {//如果m是负数
            m = -m;//先变成大于0的
            flg = true;
        }
        //123 123%10 = 3 123/10 = 12 12/10 =1 1/10 =0
        while(m != 0) {//当m等于0的时候就已经除完了
            ret.append(table.charAt(m%n));
            m = m/n;
            // 123 除完  3  2  1
        }
        // 3 2 1 如果flg是真的,那么要这里要变为负数加'"-"号
        if(flg) {
            ret.append("-");
        }
        ret.reverse();
        System.out.println(ret);
    }
}

自己做的笔记:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷偷敲代码的青花瓷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值