笔试题1:将一个字符串转化成整数:把字符串转换成整数__牛客网
将一个字符串转化成整数,要求不能使用字符串转化成整数的库函数,数值为0或者字符串不是一个合法的数值那么返回0
输入描述:输入一个字符串,包含数字字母符号,可以为空
返回值叙述:如果是合法的数字表达那么直接返回该数字,否则返回0
1)输入:"+2147483647"
输出:2147483647
2)输入:"1a33"
输出:0
3)输入:"123"
输出:123
现在我们来进行查看一个正常情况:
1)比如说现在有一个正常的字符串是123,这里面包含了三个字符,一个是字符'1',一个是字符'2',一个是字符'3'
2)但是我们在ASCIL码表中可以看出字符0对应的十进制数是48,字符1对应的十进制数是49,字符2对应的十进制数是50
3)我们如果说想要把一个字符串变成整数,那么就需要套一个公式:sum的初始值是0
sum=sum*10+str[i]-'0'
比如说现在有一个字符串是123
3.1)str[0]='1',sum=0+'1'-'0'=1;
3.2)str[1]='2',sum=1*10+'2'-'0'=12;
3.3)str[2]='3',sum=12*10+'3'-'0'=123;
import java.util.*; public class Solution { public boolean isTrue(char ch){ if(ch>='0'&&ch<='9'){ return true; }else{ return false; } } public int StrToInt(String str){ str=str.trim();//去掉两边的空格 if(str==null||str.equals("")){ return 0; }//如果说去掉两边的空格之后还是一个空字符串,那么就直接返回0 //1.我们期望先把整个字符串变成一个合法的数字,例如说-123,123之类的 StringBuilder sb=new StringBuilder(); for(int i=0;i<str.length();i++){ char ch=str.charAt(i); if(ch=='+'||ch=='/'){ //如果出现了这两个字符,因为题目说这两个字符是出现在第一行的,所以说直接略过 //拼接成一个空字符串 sb.append(""); continue; } if(ch=='-'){ sb.append('-'); continue; } if(isTrue(ch)){ sb.append(ch); }else{ return 0; } } String result=new String(sb); int sum=0; boolean flag=false; //看看这个字符串在下面遍历的过程中有没有被转化成整数 int data=1;//负数标志位 //2.经过上面的步骤,我们已经成功把一个字符串转化成了一个合法的只包含整数字符或者是包含字符'-' //对于出现在第一个字符穿的位置,我们要进行特殊记录一下 for(int i=0;i<result.length();i++){ char ch=result.charAt(i); if(ch=='-'){ data=-1; } if(isTrue((ch))){ sum=sum*10+ch-'0'; flag=true; } } if(flag==true){ //标志位*最终转化的数字 return data*sum; }else{ //如果说这个字符串只包含-,那么直接返回0 return 0; } } }
下面还有一种写法:
import java.util.*; public class Solution { public boolean isTrue(char ch){ if(ch>='0'&&ch<='9'){ return true; }else{ return false; } } public int StrToInt(String str){ if(str==null||str.isEmpty()){ return 0; } int flag=1; //特殊判断第一个字符 if(str.charAt(0)=='+') flag=1; if(str.charAt(0)=='-') flag=-1; int sum=0; for(int i=0;i<str.length();i++){ //1.这不能从1下标开始因为有可能压根就没有+和-,比如说就是一个123呢?所以说解决方法就是说把字符串变成一个字符数组,如果说判断字符数组的第一个字符为'+'或者是'-'那么就设置标志位 //2.然后将第一个字符设置成字符'0',这样就解决了问题 if(str.charAt(i)>='0'&&str.charAt(i)<='9'){ sum=sum*10+str.charAt(i)-'0'; }else{ if(str.charAt(i)=='+'||str.charAt(i)=='-'){ continue; } sum=0; break; } } return flag*sum; } }
笔试题2:不要2不要二_牛客题霸_牛客网
二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。这是一个纯数学问题:
1)对于两个格子坐标(X1,Y1),(X2,Y2)的欧几里得距离为:
((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2))的算术平方根不能等于2
所以说(X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2)的平方不能等于4
2)所以说我们现在就来找一下使得(X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2)的所有情况
3)我们可以对加法表达式进行分解:
1+3=4
3+1=4
2+2=4
0+4=4
4+0=4
所以在这里面我们仔细地分析了一下,前三个表达式是不能够进行存在的
所以说要么是(X1-X2)*(X1-X2)=0和(Y1-Y2)*(Y1-Y2)=4
要么是(X1-X2)*(X1-X2)=4和(Y1-Y2)*(Y1-Y2)=0
4)所以说最终的结果就是: X1=X2,Y2=Y1+2
Y1=Y2,X1=X2+2
5)题目要求是任意两块蛋糕的欧几里得的距离不能等于2,那么也就是说如果我们在
array[i][j]位置处存放了蛋糕,那么array[i+2][j]和array[i][j+2]的位置处就不能存放蛋糕了
6)所以说在我们进行创建数组的时候,数组的默认值都是0,那么如果说这个位置开始进行存放了蛋糕,那么对应位置的array[i+2][j]和array[i][j+2]的位置都不能进行存放蛋糕,那么就手动置为1;
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int m=scanner.nextInt(); int n=scanner.nextInt(); int[][] array=new int[m][n]; int count=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(array[i][j]==0){ count++; if(j+2<n){ array[i][j+2]=1; } if(i+2<m){ array[i+2][j]=1; } } } } System.out.println(count); } }
笔试题3:有效的括号序列:有效括号序列_牛客题霸_牛客网
我们首先要首先要进行注意下了:
一:如果说要判断我们的字符串是否合法
1)字符串只能由括号组成
2)进行括号匹配
二:我们该如何选择一个合适的数据结构呢?
2.1)首先我们要存储遍历过的左括号,我们在这里还需要进行注意最先遍历到的左括号最后被匹配走
2.2)最后遍历到的左括号最先被右括号匹配
2.3)只有当我们遍历完这个字符串之后,栈里面也恰好没有元素了,我们就说左右括号匹配
三:这个题主要有四种情况
1)左右括号匹配
2)左右括号不匹配
3)左括号多
4)右括号多
import java.util.*; public class Solution { public boolean isValid (String str) { if(str.length()%2==1){ //字符串长度是奇数,那么说明此时括号一定不匹配 return false; } Stack<Character> stack=new Stack<>(); for(int i=0;i<str.length();i++){ char ch=str.charAt(i); if(ch=='('||ch=='{'||ch=='['){ //如果是左括号就直接放入到栈里面 stack.push(ch); }else{ //只有右括号而没有左括号,或者是右括号太多 if(stack.isEmpty()){ return false; } char s=stack.pop(); if((ch==')'&&s=='(')||(ch==']'&&s=='[')||(ch=='}'&&s=='{')){ }else{ //左右括号不匹配 return false; } } } //说明左括号多 if(!stack.isEmpty()){ return false; } return true; } }
笔试题4:斐波那契额数列Fibonacci数列_牛客题霸_牛客网
思路:
1)我们正常输入了一个正整数N,我们想求它比它小的最近的斐波那契额数列的那个数left和比他大的最近的斐波那契额数列的那一个数right
2)返回right-N和N-left的最小值
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static int GetMin(int x,int y){ if(x>y) return y; return x; } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int index=scanner.nextInt(); int a=0; int b=1; int c=1; while(c<index){ a=b; b=c; c=a+b;//条件只能写在最下面 } int min=Math.abs(GetMin(index-b,c-index)); System.out.println(min); } }