一、数列求和
有数列为:9,99,999,...,9999999999。要求使用程序计算此数列的和,并在控制台输出结果。(请尝试使用循环的方式生成这个数列并同时在循环中求和)
方法1:
public static void main(String[] args) {
//数列求和
long sum = 0L;
for (long i = 9; i <= 9999999999L; i=i*10+9) {
sum+=i;
}
System.out.println(sum);
}
方法2:
public static void main(String[] args) {
long[] arr = {9,99,999,9999,99999,999999,9999999,99999999,999999999,9999999999L};
long sum = 0L;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println(sum);
}
二、二维数组求和
给定一个二维数组,请你编写一个求和函数,计算出这个数组元素的和
public static void main(String[] args) {
int[][] arr = {{11,33,55},{22,44,66,88},{131,214,315,146},{928,827,726,625},{424,525}};
int sum=add(arr);
System.out.println(sum);
}
public static int add(int[][] arr) {
int sum=0;
for(int i = 0;i < arr.length;i++) {
for(int j = 0;j < arr[0].length;j++) {
sum += arr[i][j];
}
}
return sum;
}
我们可以发现这里出现了数组越界错误.
我们可以发现这里纵标限定的为arr[0]的长度,但这个二维数组的每个纵行的长度是不一样的,所以这样会出现数组越界错误。
public static void main(String[] args) {
int[][] arr = {{11,33,55},{22,44,66,88},{131,214,315,146},{928,827,726,625},{424,525}};
int sum=add(arr);
System.out.println(sum);
}
public static int add(int[][] arr) {
int sum=0;
for(int i = 0;i < arr.length;i++) {
for(int j = 0;j < arr[i].length;j++) {
sum += arr[i][j];
}
}
return sum;
}
我们再打印二维数组的时候,纵行的范围必须是每行的范围才可以.
for (int[] arr1:arr) {
for (int x:arr1) {
sum += x;
}
}
或者利用foreach也可以.
三、判断各类型字符个数
输入一行字符串,分别统计出其中英文字母、空格、数字和其它字符的个数
public static void main(String[] args) {
int numbers = 0;
int words = 0;
int space = 0;
int other = 0;
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
for (int i = 0; i < str.length(); i++) {
if(Character.isLetter(str.charAt(i))) {
words++;
}else if(Character.isDigit(str.charAt(i))) {
numbers++;
}else if(Character.isWhitespace(str.charAt(i))) {
space++;
}else {
other++;
}
}
System.out.println("英文字母"+words+"数字"+numbers+"空格"+space+"其他"+other);
}
四、定义打印方法
已知有三个类:First、Second、Third。要求定义一个打印方法,支持传入任意引用类型的参数(包括上述三个类),并在方法内部打印出对象的字符串形式。
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String className = scanner.next();
// print就是需要你定义的方法
print(Class.forName(className).newInstance());
}
}
public static void print(Object obj) {
System.out.println(obj.toString());
}
}
class First {
public String toString() {
return "First";
}
}
class Second {
public String toString() {
return "Second";
}
}
class Third {
public String toString() {
return "Third";
}
多态性,是子类的对象赋给了父类的引用,使用的前提是有继承关系、有方法的重写
本题中的三个类都重写了toString()方法
那么很显然,需要找到一个类,是本题中三个类的共同父类,又有toString()方法
并且有forName()方法和newInstance()方法,以便在第10行的print()中能传入一个对象
不用想了,平时就是用 Object类,它是所有类的父类,又拥有各种各样的方法
# 五、类型判断
父类Base有两个子类:Sub1、Sub2,现有一个方法getClassName(),要求传入Base类型的实例,在方法内部判定其具体的类型,返回的是类型的简单名字(不含包名),请补全getClassName()方法的判断逻辑。
输入描述:
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String className = scanner.next();
Base obj = (Base) Class.forName(className).newInstance();
System.out.println(getClassName(obj));
}
}
public static String getClassName(Base obj) {
if(obj instanceof Sub1) {
return "Sub1";
}else if(obj instanceof Sub2) {
return "Sub2";
}else {
return "Base";
}
}
class Base {
}
class Sub1 extends Base {
}
class Sub2 extends Base {
}