目录
学习-Java位运算之移位运算
本关任务:
将 -20 到 -11 中的整数经过 << 运算符向左移动 2 位(包括 -20 和 -11);
将 -10 到 9 中的整数经过 >>> 运算符向右移动 1 位(包括 -10 和 9);
将 10 到 20 中的整数经过 >> 运算符向右移动 3 位(包括 10 和 20);
将上述结果依次输出(顺序为从 -20 到 10)。
输出例子:将-20经过<<运算符向左移动2位后的结果为-80
写代码不想打字的话,就直接按照测试集的答案复制粘贴。
/**
* 任务:对-20到20的数字按照要求进行运算。
* 类名为:BitwiseOperation
*/
public class BitwiseOperation {
public static void main(String[] args) {
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 第一步:定义一个 for 循环,设置起始值
for(int i=-20;i<=20;i++){
if(i>=-20&&i<=-11){
System.out.printf("将%d经过<<运算符向左移动2位后的结果为%d\n",i,i<<2);
}
else if(i>=-10&&i<=9){
System.out.printf("将%d经过>>>运算符向右移动1位后的结果为%d\n",i,i>>>1);
}
else if(i>=10&&i<=20){
System.out.printf("将%d经过>>运算符向右移动3位后的结果为%d\n",i,i>>3);
}
}
// 第二步:判断该值属于哪个区间,进行相应的运算
/********** End **********/
}
}
学习-Java继承和多态之方法重载
本关任务:使用重载方法为 Student 类创建三个构造方法。
关键是看懂题目,明白要你写的是什么。全是内容,无技巧。
/**
* 任务:使用重载方法为 Student 类创建三个构造方法。
* 类名为:Student
*/
public class Student {
private String name; // 学生的姓名
private String num; // 学生的学号信息
private double grades; // 学生的成绩
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 创建一个有参构造函数,携带一个学生姓名的参数
public Student(String name){
this.name=name;
}
// 创建一个有参构造函数,携带学生姓名和学生学号信息的参数
public Student(String name,String num){
this.name=name;
this.num=num;
}
// 创建一个有参构造函数,携带学生姓名、学生学号和学生成绩信息的参数
public Student(String name,String num,int grades){
this.name=name;
this.num=num;
this.grades=grades;
}
/********** End **********/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public double getGrades() {
return grades;
}
public void setGrades(double grades) {
this.grades = grades;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", num='" + num + '\'' +
", grades=" + grades +
'}';
}
}
数组与方法
第1关:倒转数组
本关任务:掌握如何将数组作为参数,传递给方法,并编写一个方法,提供倒转数组的功能。
见代码
package step1;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
int[] a = new int[num];
for (int i=0;i<a.length;i++){
a[i] = input.nextInt();
}
reverse(a);
for (int i=0;i<a.length;i++){
System.out.print(String.format("%d ",a[i]));
}
}
//请在指定位置填写代码。
/********* Begin *********/
public static void reverse(int[] b){
Scanner input = new Scanner(System.in);
int mid=b.length/2;
int t;
for (int i=0;i<mid;i++){ //以中间的数为对称轴,交换对称轴两边的数
t=b[i];
b[i]=b[b.length-i-1];
b[b.length-i-1]=t;
}
}
/********* End *********/
}
第2关:消除重复
本关任务:继续练习如何灵活使用数组以及方法来解决实际问题,并编写一个方法,接收一个数组作为参数,返回不含重复元素的数组。
思路:用一个数组接收原数组中不重复的数字,有一些细节问题,注意一下。
详细思路见代码
package step2;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
int [] a = new int[num];
for (int i=0;i<a.length;i++){
a[i] = input.nextInt();
}
int [] r = getSet(a);
for (int i=0;i<r.length;i++){
System.out.print(String.format("%d ",r[i]));
}
}
//请在指定位置填写代码。
/********* Begin *********/
public static int[] getSet(int[] a){
int[] array=new int[a.length]; //用来接收去重后的a[]数组
array[0]=a[0]; //存第一个元素
int flag=0,n=1; //flag标记是否该数字已经出现
for (int i=0;i<a.length;i++){
for(int j=0;j<n;j++){ //遍历已经保存的数字
if(array[j]==a[i]){
flag=1; //该数字已出现
break;
}
}
if(flag==0){
array[n++]=a[i]; //该数字未出现,保存
}
flag=0;
}
int[] ans=new int[n]; //因为array[]的个数不符合要求
for(int i=0;i<n;i++)
ans[i]=array[i];
return ans;
}
/********* End *********/
}
第3关:大整数加法
难的一道
本关任务:利用所学数组的方法使用技巧以及进位加法的知识,编程实现解决大整数相加的问题。
先说思路:将字符串逆序存入整型数组,然后每个位置对应相加,注意进位问题,最后在转化为字符串返回。
(超详细的解题思路,一看就懂,有图有说明)
有几点要注意:
1.String的使用方法
(1)长度;(2)单个字符引用
参考详细链接:Java【String类】的详解_java string_快到锅里来呀的博客-优快云博客
2.StringBuilder和StringBuffer
常规的整型转化为String方法效率低,很不方便
StringBuilder类:字符缓冲区,可以提高字符串的效率
StringBuilder的常用方法:
public StringBuilder append(…):添加任意类型数据的字符串形式,并返回当前对象自身
package step3;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String n1 = input.nextLine();
String n2 = input.nextLine();
String result = add(n1,n2);
System.out.println(result);
}
//请在指定位置填写代码。
/********* Begin *********/
public static String add(String a,String b){
int n=a.length()>b.length()?a.length():b.length(); //长度
int aa[]=new int[n+1],bb[]=new int[n+1];
//逆序存数字
for(int i=0;i<a.length();i++){
aa[i]=a.charAt(a.length()-1-i)-'0';
}
for(int i=0;i<b.length();i++){
bb[i]=b.charAt(b.length()-1-i)-'0';
}
//从数字的末尾开始相加,即数组从头开始相加
int temp,ans[]=new int[n+1];
for(int i=0;i<n;i++){
temp=aa[i]+bb[i]+ans[i];
if(temp>9){
ans[i+1]=1;
ans[i]=temp-10;
}
else{
ans[i]=temp;
}
}
//把ans数组再次逆序并转成String
StringBuilder res = new StringBuilder();
//用于标记是否找到大整数的最高有效位
boolean findFirst = false;
for (int i=ans.length-1; i>=0; i--) {//从后往前
if(!findFirst){
if(ans[i] == 0){ //用于跳过结果数组末尾的0
continue;
}
findFirst = true;
}
res.append(ans[i]);
}
return res.toString();
}
/********* End *********/
}