Java面向对象编程(49)

简介: Java面向对象编程(49)

顺时针打印矩阵

题目描述:对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。

给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

public class Printer {
    //顺时针打印矩阵
    public int[] clockwisePrint(int[][] mat, int n, int m) {
        //左上角坐标
        int x1 = 0;
        int y1 = 0;
        //左下角坐标
        int x2 = n - 1;
        int y2 = m - 1;
        int[] arr = new int[n * m];
        int idx = 0;
        while (x1 <= x2 && y1 <= y2) {
            //第一行:x1,y1~y2
            for (int i = y1; i <= y2; ++i) {
                arr[idx++] = mat[x1][i];
            }
            //最后一列:x1+1~x2,y2
            for (int i = x1 + 1; i <= x2; ++i) {
                arr[idx++] = mat[i][y2];
            }
            //最后一行:x2,y2-1,y1---->x1 < x2
            if (x1 < x2) {
                for (int i = y2 - 1; i >= y1; --i) {
                    arr[idx++] = mat[x2][i];
                }
            }
            //第一列:x2-1~x1+1,y1---->y1<y2
            if (y1 < y2) {
                for (int i = x2 - 1; i > x1; --i) {
                    arr[idx++] = mat[i][y1];
                }
            }
            x1++;
            y1++;
            x2--;
            y2--;
        }
        return arr;
    }
}

Fibonacci数列

题目描述:Fibonacci数列是这样定义的:

F[0]=0

F[1]=1

for each i ≥ 2:F[]=F[ i-1]+F[i-2]

因此,Fibonacci数列就形如:0,1,1,2,3,5,8,13...,在Fibonacc数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

输入描述:输入为一个正整数N(1≤N≤1,000,000)

输出描述:输出一个最小的步数变为Fibonacci数"

Fibonacci数列

题目描述:Fibonacci数列是这样定义的:

F[0]=0

F[1]=1

for each i ≥ 2:F[]=F[ i-1]+F[i-2]

因此,Fibonacci数列就形如:0,1,1,2,3,5,8,13...,在Fibonacc数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

输入描述:输入为一个正整数N(1≤N≤1,000,000)

输出描述:输出一个最小的步数变为Fibonacci数"

public class Main79 {
    //Fibonacci数列
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int f1=0;
        int f2=1;
        while (f2<n){
            int f3=f1+f2;
            f1=f2;
            f2=f3;
        }
        //循环结束f1<n<=f2
        int min=Math.min(n-f1,f2-n);
        System.out.println(min);
    }
}

合法括号序列判断

题目描述:给定一个字符串A和其长度n,请返回一个bool值代表它是否为一个合法的括号串(只能由括号组成)。

public class Parenthesis {
    //合法括号序列判断
    public boolean chkParenthesis(String A, int n) {
        if (n % 2 != 0) {
            return false;
        }
        Stack<Character> stack = new Stack<>();
        for (char c : A.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                //左括号先于右括号出现,为非法
                if (stack.isEmpty()) {
                    return false;
                } else if (stack.peek() == '(') {
                    stack.pop();
                }
            } else {
                return false;
            }
        }
        return stack.isEmpty();
    }
}

参数解析

题目描述:在命令行输入如下命令:

xcopy /s c:\\ d:\\e

各个参数如下:

参数1:命令字xcopy

参数2:字符串/s

参数3:字符串c:\\

参数4: 字符串d:\\e

请编写一个参数解析程序,实现将命令行各个参数解析出来。

解析规则:

1.参数分隔符为空格

2.对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s "C:\\program files" "d:\"时,参数仍然是4个,第3个参数应 该是字符串C:\\program files,而不是C:\\program,注意输出参数时,需要将""去掉,引号不存在嵌套情况。

3.参数不定长

4.输入由用例保证,不会出现不符合要求的输入

数据范围:字符串长度:1<=len<=1000

进阶:时间复杂度:O(N),空间复杂度:O(M)

输入描述:输入一行字符串,可以有空格

输出描述:输出参数个数,分解后的参数,每个参数都独占一行

public class Main80 {
    //参数解析
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str= scanner.nextLine();
        int count=0;
        for (int i = 0; i < str.length(); i++) {
            //遇到双引号的时候,要一直遍历,直到碰到第二个双引号
            //才说明双引号中的参数遍历完了
            if (str.charAt(i)=='"'){
                do {
                    i++;
                }while (str.charAt(i) !='"');
            }
            //碰到双引号以外的空格
            if (str.charAt(i)==' '){
                count++;
            }
        }
        //参数的总个数=空格个数+1
        System.out.println(count+1);
        int flag=1;
        for (int i = 0; i < str.length(); i++) {
            //当碰到第一个双引号flag变为0,当碰到第二个双引号flag变为1
            //说明在flag==0的时候,我们一直在遍历双引号中的参数
            if (str.charAt(i)=='"'){
                flag^=1;
            }
            //除了双引号中的空格和双引号,其他字符都输出
            if (str.charAt(i) !=' ' && str.charAt(i) !='"'){
                System.out.print(str.charAt(i));
            }
            //双引号里面的空格需要输出
            if (str.charAt(i)==' ' && flag==0){
                System.out.print(str.charAt(i));
            }
            //碰到双引号以外的空格需要换行
            if (str.charAt(i)==' ' && flag==1){
                System.out.println();
            }
        }
    }
}

跳石板

题目描述:小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......

这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和 本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。

例如: N = 4,M = 24:

4->6->8->12->18->24 于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板

输入描述:输入为一行,有两个整数N,M,以空格隔开。

(4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)

输出描述:输出小易最少需要跳跃的步数,如果不能到达输出-1

public class Main81 {
    //跳石板
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int m=scanner.nextInt();
        int[] step=new int[m+1];
        for (int i = 0; i < m+1; i++) {
            step[i]=Integer.MAX_VALUE;
        }
        step[n]=0;
        for (int i = n; i < m; i++) {
            if (step[i]==Integer.MAX_VALUE){
                continue;
            }
            List<Integer> list=div(i);
            //j代表一次可以跳几块石板
            //i代表当前石板的编号
            for (int j:list) {
                if (i+j<=m && step[i+j] !=Integer.MAX_VALUE){
                    step[i+j]=Math.min(step[i+j],step[i]+1);
                }else if (i+j<=m){
                    step[i+j]=step[i]+1;
                }
            }
        }
        if (step[m]==Integer.MAX_VALUE){
            System.out.println(-1);
        }else {
            System.out.println(step[m]);
        }
    }
    public static List<Integer> div(int num){
        List<Integer> list=new ArrayList<Integer>();
        for (int i = 2; i*i <= num; i++) {
            if (num%i==0){
                list.add(i);
                if (num/i !=i){
                    list.add(num/i);
                }
            }
        }
        return list;
    }
}


相关文章
|
25天前
|
安全 Java 数据安全/隐私保护
|
2月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
94 3
|
2月前
|
Java
Java面向对象编程
Java面向对象编程
|
2月前
|
存储 Java
JAVA面向对象编程
JAVA面向对象编程
|
2月前
|
Java
Java中的面向对象编程特性(封装、继承、多态)
Java中的面向对象编程特性(封装、继承、多态)
|
3月前
|
设计模式 Java 程序员
Java中面向对象编程的实现
Java中面向对象编程的实现
|
3月前
|
存储 Java
深入解析 Java 面向对象编程与类属性应用
面向对象编程 (OOP) 是一种编程范式,它将程序组织成对象。对象包含数据和操作数据的方法。 OOP 的优势: 更快、更易于执行 提供清晰的结构 代码更易于维护、修改和调试 提高代码重用性 减少开发时间
65 0
|
4月前
|
Java 编译器
【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]
【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]
18 0
|
4月前
|
Java 编译器
【JAVA面向对象编程】--- 探索子类如何继承父类
【JAVA面向对象编程】--- 探索子类如何继承父类
19 0
|
4月前
|
Java 编译器
【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)
【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)
22 0