上机练习题(下)

13、给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。

import java.util.*;
public class Main{
    
    
    public static void main(String[] args) {
    
    
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
    
    
            String s1=sc.nextLine();
            String s2=sc.nextLine();
            String max=s1.length()>=s2.length()?s1:s2;
            String min=s1.length()>=s2.length()?s2:s1;
            int l=0;
            String s="";
            for (int i = 0; i < min.length(); i++) {
    
    
                for (int j = i+1; j <= min.length(); j++) {
    
    
                    if (max.contains(min.substring(i,j)) && j-i>l) {
    
    
                        l=j-i;
                        s=min.substring(i,j);
                    }
                }
            }
            System.out.println(s.length());
        }
        sc.close();
    }
}

14、验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    
    
	public static void main(String[] args) throws IOException{
    
    
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String s;
		while((s=bf.readLine())!=null){
    
    
			long m = Integer.valueOf(s);
			long a = m*m-m+1;
			System.out.print(a);
			for(int i=1; i<m; i++){
    
    
				System.out.print("+"+(a+=2));
			}
			System.out.println();
		}
		bf.close();
	}
}

15、找出给定字符串中大写字符(即’A’-‘Z’)的个数

import java.util.Scanner;
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
    
    
            char[] ch = sc.nextLine().toCharArray();
            int nums = 0;
            for(int i=0;i<ch.length;i++){
    
    
                if(ch[i]>='A' && ch[i]<='Z'){
    
    
                    nums++;
                }
            }
            System.out.println(nums);
        }
    }
}

16、给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
所谓回文串,指左右对称的字符串。所谓子串,指一个字符串删掉其部分前缀和后缀(也可以不删)的字符串

import java.util.*;
public class Main {
    
    
	// 线性复杂度 O(n),求最长回文子串
	public static int getLongestPalindromeLength(String str) {
    
    
		// 先处理字符串
		StringBuilder sb = new StringBuilder();
		sb.append("#");
		for (int i = 0; i < str.length(); i++) {
    
    
			sb.append(str.charAt(i));
			sb.append("#");
		}
		// 记录回文半径长度
		int maxlen = 0;
		for (int i = 0; i < sb.length(); i++) {
    
    
			int r = 1;
			// 尝试更大半径
			while(i-r>=0 &&i+r<sb.length()&& sb.charAt(i-r)==sb.charAt(i+r)){
    
    
				r++;
			}
			maxlen = r > maxlen ? r :maxlen;
		}
		return maxlen-1;
	}
	public static void main(String[] args) {
    
    
		Scanner in = new Scanner(System.in);
		while (in.hasNextLine()) {
    
    
			String str = in.nextLine();
			System.out.println(getLongestPalindromeLength(str));
		}
	}
}

17、求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1

import java.util.*;
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
    
    
            int input = sc.nextInt();
            String bi = Integer.toBinaryString(input);
            String subs = "1";
            int cnt = 1;
            for(int i=1; i<=bi.length(); i++) {
    
    
                if(bi.contains(subs)) {
    
    
                    cnt = subs.length();
                    subs += "1";
                }
            }
            System.out.println(cnt);
        }
    }
}

18、请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

import java.util.*;
public class Main
{
    
    
    public static void main(String []args)
    {
    
    
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
    
    
            int n = sc.nextInt();
            int m = sc.nextInt();
            
            int top = factorial(m+n);
            int behind = factorial(m)*factorial(n);
            System.out.println(top/behind);
        }
    }
    public static int factorial(int n)
    {
    
    
        int sum = 1;
        for(int i = 1;i<=n;i++)
        {
    
    
            sum *= i;
        }
        return sum;
    }
}

19、首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。0即不是正整数,也不是负数,不计入计算

//一种简单的做法
import java.util.Scanner;
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner s = new Scanner(System.in);
        while(s.hasNext()){
    
    
            int n = s.nextInt();
            int[] arr = new int[n];
            int countf = 0;
            int countz = 0;
            double sum = 0.0;
            double p = 0.0;
            for(int i = 0;i < n;i++){
    
    
                arr[i] = s.nextInt();
                if(arr[i] < 0){
    
    
                    countf++;
                }
                if(arr[i] > 0){
    
    
                    countz++;
                    sum += arr[i];
                    p = (double)(sum / countz);
                }
            }
            System.out.println(countf + " " + String.format("%.1f",p));
        }
    }
}

20、等差数列 2,5,8,11,14。。。。(从 2 开始的 3 为公差的等差数列)输出求等差数列前n项和

//等差数列求和公式:Sn=a1*n+n*(n-1)*d/2
import java.util.*;
  
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
    
    
            int n = in.nextInt();
            if(n<1){
    
    
                System.out.println(-1);
            }else{
    
    
                System.out.println((2*n+3*n*(n-1)/2));
            }
        }
        in.close();
    }
}

21、将一个字符串str的内容颠倒过来,并输出。

import java.util.*;
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
    
    
            String str = sc.nextLine();//next()是遇到空格;nextLine()是遇到回车
            StringBuilder sb = new StringBuilder(str);           
            System.out.println(sb.reverse().toString());
        }
    }
}

22、正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

import java.util.Scanner;
public class Main {
    
    
    /**
     * 求最小公倍数:公式法
     * 两个数a,b的最小公倍数是a*b/gcd(a,b)
     * 由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积,即(a,b)× [a,b] = a × b
     * 所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
     */
    public static int lcm(int m, int n) {
    
    
        return (m * n) / gcd(m, n);
    }
    /**
     * 求最大公约数:辗转相除法
     * 1\. a/b,令r为所得余数(0≤r<b) 若r=0,算法结束,a即为答案
     * 2\. 互换:置 a←b,b←r,并返回第一步
     */
    private static int gcd(int a, int b) {
    
    
        if (b == 0) return a;
        return gcd(b, a % b);
    }
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        int a = in.nextInt();
        int b = in.nextInt();
        System.out.println(lcm(a, b));
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43980936/article/details/121616472
今日推荐