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));
}
}