一、
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
输入描述:
输入一个int整数
输出描述:
输出分解后的string
示例1
输入
6
输出
31+33+35+37+39+41
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//找规律发现就是n的平方往前往后隔2加n个数
//偶数则初始是n^2+1和n^2-1;奇数则初始是n^2
while(sc.hasNext()) {
int n = sc.nextInt();
StringBuffer sb = new StringBuffer();
int square = n * n;
if(n % 2 == 0) {
int start = (square-1) - 2*(n/2 - 1);
for(int i = 0; i < n - 1; i++) {
sb.append((start + 2 * i) + "+");
}
sb.append(start + 2*(n - 1));
}else {
int start = square - 2*(n / 2);
for(int i = 0; i < n - 1; i++) {
sb.append((start + 2 * i) + "+");
}
sb.append(start + 2*(n - 1));
}
System.out.println(sb.toString());
}
sc.close();
}
}
二、
计算两个字符串的最大公共字串的长度,字符不区分大小写
输入描述:
输入两个字符串
输出描述:
输出一个整数
示例1
输入
asdfas werasdfaswer
输出
6
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//最长公共子串问题,动态规划
while(sc.hasNext()) {
String str1 = sc.next().toLowerCase();
String str2 = sc.next().toLowerCase();
System.out.println(process(str1, str2));
}
sc.close();
}
private static int process(String str1, String str2) {
int n = str1.length();
int m = str2.length();
int[][] dp = new int[n + 1][m + 1];
int max = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(str1.charAt(i - 1) == str2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}else {
dp[i][j] = 0;
}
max = Math.max(max, dp[i][j]);
}
}
return max;
}
}
三、
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
?:匹配1个字符
输入描述:
先输入一个带有通配符的字符串,再输入一个需要匹配的字符串
输出描述:
返回匹配的结果,正确输出true,错误输出false
示例1
输入
te?t*.*
txt12.xls
输出
false
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//字符串匹配问题,动态规划
while(sc.hasNext()){
String reg = sc.next();
String str = sc.next();
System.out.println(process(reg, str));
}
sc.close();
}
private static boolean process(String reg, String str) {
int n = reg.length();
int m = str.length();
boolean[][] dp = new boolean[n + 1][m + 1];
dp[0][0] = true;
for(int i = 1; i <= n; i++) {
if(reg.charAt(0) == '*') {
dp[i][0] = true;
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j<= m; j++) {
if(reg.charAt(i - 1) == '*') {
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
}else {
dp[i][j] = dp[i - 1][j - 1] &&
(reg.charAt(i - 1) == '?' || reg.charAt(i- 1) == str.charAt(j - 1));
}
}
}
return dp[n][m];
}
}
四、
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出
jklmnop
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//最长公共子串求大小用动态规划;直接求串则用截取法
while(sc.hasNext()) {
String str1 = sc.next().toLowerCase();
String str2 = sc.next().toLowerCase();
System.out.println(process(str1, str2));
}
sc.close();
}
private static String process(String str1, String str2) {
if(str2.length() < str1.length()) {
String tmp = str1;
str1 = str2;
str2 = tmp;
}
int n = str1.length();
String res = null;
int max = 0;//截止串最长长度
for(int i = 0; i < n; i++) {//截止起始点
for(int j = i + max; j < n; j++) {//截止终点
String sub =str1.substring(i , j + 1);
if(str2.contains(sub)) {
max = j + 1 - i;
res = sub;
}else {
break;
}
}
}
return res;
}
}