引言:
😋大家好我是青花瓷,我们在学习知识的同时,也不能不去刷题,刷题不仅能够提高我们对知识对代码的掌握,更能在以后笔试中,运筹帷幄,决胜千里,今天开始,我将每天为大家分享每日一题,大家一起学习,如果喜欢文章的朋友记得点赞,收藏,如果觉得博主写的不错,不要忘记关注博主哦,你们的关注就是对博主最大的支持!
🚩字符串转化成整数
牛客地址:
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);
}
}
自己做的笔记: