目录
- 1.走方格的方案数
- 1.1题目
- 1.2思路讲解
- 1.3代码展示
- 2.另类加法
- 2.1题目
- 2.2思路讲解
- 2.3代码展示
- 3.选择题
1.走方格的方案数
1.1题目
链接: link
描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
输入描述:
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
输出一行结果
示例1
输入:
2 2
输出:
6
1.2思路讲解
要求一个n*m的棋盘中,从走上角到右下角有多少种方法。
我们先来看一下,分为n=1,m=1或者n=1,m>=1或者n>=1,m=1。
我们再来看,当n>=1,m>=1的时候。
当我们要从走上角到右下角的时候,走的步数就等于从(n-1,m)+(n,m-1)格子的步数。
比如我们要求一个3*3的格子,我们就要求右边第一个点,也就是右边的(n-1,m)的格子步数+要求下边第一个点,也就是下边的(n,m-1)的格子步数
因此我们总结出:n,m条路径的方案数=(n,m-1)条数+(n-1,m)的条数
知道,n=1,m>=1 或 n>=1,m=1这时就是终止条件
因此,我们使用递归,当(n=1,m>=1)或者 (n>=1,m=1)的时候就return,不是就
return (n-1,m)+(n,m-1);
1.3代码展示
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();
int m = in.nextInt();
int ret=func(n,m);
System.out.println(ret);
}
}
public static int func(int n,int m)
{
if(n==1 && m>=1)
{
return m+n;
}
else if(m==1 && n>=1)
{
return m+n;
}
return func(n-1,m)+func(n,m-1);
}
}
2.另类加法
2.1题目
链接: link
描述
给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
测试样例:
1,2
返回:3
2.2思路讲解
这里我们使用到 位运算符
有两个总结:
1.二进制位异或的结果,就是两个数对应相加的结果,不考虑进位
2.二进制位与后 在后移一位,是两个数对应相加的结果,(只考虑进位)
给大家举个例子
a=1 b=2
0001 0010
a ^ b =0001^0010=0011=3
a&b=0001&0010 <<1 = 0000
此时与后,右移一位的结果为0,就说明此时异或的结果就是相加的结果
两个数相加,如果不需要进位的话,那么这两个数异或的值就是这两个数的和
比如 2+3
2=0010,3=0011
2^3=0010 ^ 0011=0001(不等于5)
2 & 3 =0010&0011=0010<<1=0100(不等于0,说明需要进位,此时异或的值不等于和)
这个时候我们就将ret=0001,sun=0100
将 a=0001,b=0100,再一次进行异或
a ^b=0001 ^ 0100=0101=5
a&b=0001&0100=0(值为0,将相当于此时的异或值就等于和)
我们可以看出,这个问题如果需要进位就需要考虑循环,那么条件是什么?
我们每一次将与后右移一位的值,赋值给B,判断B是否=0,如果等于0,就直接输出异或的值就可以了,因此我们的循环判断条件就是当B!=0时
2.3代码展示
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
if(B==0)
{
return A;
}
while(B!=0)
{
int ret=A^B;
int C=(A&B)<<1;
A=ret;
B=C;
}
return A;
}
}
3.选择题
1.下面程序的输出是:(D)
String x=“fmn”;
x.toUpperCase();
String y=x.replace(‘f’,‘F’);
y=y+“wxy”;
System.out.println(y);
A FmNwxy
B fmnwxy
C wxyfmn
D Fmnwxy
这道题考查的是,字符串 x.toUpperCase();是小写的字母变为大写的字母,但是需要注意,这里变化后的是新建的一个字符串,而不是在原本的字符串上改变,因此x是不变的。
x.replace(‘f’,‘F’);是将小写字母f变为大写的F,此时x=Fmn,所以结果就是Fmnwxy
2.在 java 中,一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能各不相同,这种面向对象的特性称为(D)
A 隐藏
B 覆盖
C 重载
D 无此特性
重写:就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
重载(Overload)
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
- 关于 JAVA 堆,下面说法错误的是(D)
A 所有类的实例和数组都是在堆上分配内存的
B 对象所占的堆内存是由自动内存管理系统回收
C 堆内存由存活和死亡的对象,空闲碎片区组成
D 数组是分配在栈中的
只要是new一个对象的,都是存储在堆上的
- 一个以“.java”为后缀的源文件(C)
A 只能包含一个public类,类名必须与文件名相同
B 只能包含与文件名相同的public类以及其中的内部类
C 只能有一个与文件名相同的public类,可以包含其他非public类(不考虑内部类)
D 可以包含任意public类
一个JAVA文件可以有多个类,但是只能有一个public类,并且public类的名与文件名相同。
- JAVA语言的下面几种数组复制方法中,哪个效率最高?(B)
A for循环逐一复制
B System.arraycopy
C Arrays.copyOf
D 使用clone方法
for循环是最慢的,以内每一次都要从0下标开始,然后到指定的位置,另外就是每一次都要判断是否达到数组最大的长度和进行一次额外的记录下标值的加发运算
System.arraycopy,是浅拷贝,对于引用类型来说,拷贝的是对象的引用,不是去新建一个新的对象。
6.()仅包含方法定义和常量值。(A)
A 接口
B 变量
C 单元
D 成员
7.对文件名为Test.java的java代码描述正确的是(C)
class Person {
String name = “No name”;
public Person(String nm) {
name = nm;
}
}
class Employee extends Person {
String empID = “0000”;
public Employee(String id) {
empID = id;
}
}
public class Test {
public static void main(String args[]) {
Employee e = new Employee(“123”);
System.out.println(e.empID);
}
A 输出:0000
B 输出:123
C 编译报错
D 输出:No name
}
8.有关下述Java代码描述正确的选项是____。
public class TestClass {
private static void testMethod(){
System.out.println(“testMethod”);
}
public static void main(String[] args) {
((TestClass)null).testMethod();
}
}
A 编译不通过
B 编译通过,运行异常,报NullPointerException
C 编译通过,运行异常,报IllegalArgumentException
D 编译通过,运行异常,报NoSuchMethodException
E 编译通过,运行异常,报Exception
F 运行正常,输出testMethod
testMethod()是静态方法,类直接调用,所以不管对象是否调用都会执行,输出
9.下列java程序的输出结果为____。(B)
public class Example{
String str=new String(“hello”);
char[]ch={‘a’,‘b’};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
str=“test ok”;
ch[0]=‘c’;
A hello and ab
B hello and cb
C hello and a
D test ok and ab
E test ok and cb
F test ok and c
}
}
10.在jdk1.5之后,下列 java 程序输出结果为______。(B)
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
A true,false
B true,true
C false,true
D false,false
E 对于不同的环境结果不同
F 程序无法执行
i是基本类型,j是引用类型,但是在比较的时候会对j进行拆箱操作
用equals比较的时候会将i自动变为引用类型