目录
Demo61 (检查SSN)编写一个程序,提示用户输入一个社保号码,它的格式是DDD-DD-DDDD,其中D是一个数字。你的程序应该判断输入是否合法。
Demo62 (倒排一个字符串)编写一个程序,提示用户输人一个字符串,然后以反序显示该字符串。
Demo63 (商业:检测ISBN-13 ) ISBN-13是一个标识书籍的新标准。它使用13位数字d1d2d3d4d5d6d7d8d9d10d11d12d13。最后一位数字d13,是一个校验和,是使用下面的公式从其他数字中计算出来的:10-(d1 + 3d2 + d3 + 3d4 + d5 + 3d6 + d7 + 3d8 + d9 + 3d10 + d11 + 3d12 )%10,如果校验和为10,将其替换为0。程序应该将输入作为一个字符串读人。
Demo64 (处理字符串)编写一个程序,提示用户输入一个字符串,显示奇数位置的字符。
Demo65 (对大写字母计数)编写一个程序,提示用户输入一个字符串,然后显示该字符串中大写字母的数目。
Demo66 (最长的共同前缀)编写一个程序,提示用户输入两个字符串,显示两个字符串最长的共同前缀。
Demo67 (求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n),例如: sumDigits(234)返回9(2+3+4)。编写程序提示用户输入一个整数,然后显示这个整数所有数字的和。
Demo68 (回文整数)使用下面的方法头编写两个方法,使用reverse方法实现isPalindrome。如果一个数字的反向倒置数和它的顺向数一样,这个数就称作回文数。编写一个测试程序,提示用户输人一个整数值,然后报告这个整数是否是回文数。
Demo69 (显示0和1构成的矩阵)编写一个方法,使用下面的方法头显示n xn的矩阵:pub1ic static void printMatrix(int n),每个元素都是随机产生的0或1。编写一个测试程序,提示用户输入n,显示如下所示的n xn矩阵:
Demo70 (检测密码) 一些网站对于密码具有一些规则。编写一个方法,检测字符串是否是一个有效密码。编写一个程序,提示用户输入一个密码,如果符合规则,则显示valid Password,否则显示Invalid Password。
下面是一个运行示例:
package Exer;
import java.util.Scanner;
public class Demo61 {
/*
Demo61 (检查SSN)编写一个程序,提示用户输入一个社保号码,它的格式是DDD-DD-DDDD,其中D是一个数字。
你的程序应该判断输入是否合法。
*/
public static void main(String[] args) {
// String s = "221-12-1233";
// String[] str = s.split("-");
// System.out.println(Arrays.toString(str));
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个社保号码:");
String s = scan.next();
if(judgeNumValid(s)) {
System.out.println(s + " 是合法是社保号码!");
}else {
System.out.println(s + " 是不合法是社保号码!");
}
}
private static boolean judgeNumValid(String s) {
String[] str = s.split("-");
if (str.length == 3) {
return str[0].length() == 3 && str[1].length() == 2 && str[2].length() == 4;
}else {
return false;
}
}
}
结果:
此题使用暴力拼接法,和StringBuilder两种方法求解:
package Exer;
import java.util.Scanner;
public class Demo62 {
/*
Demo62 (倒排一个字符串)编写一个程序,提示用户输人一个字符串,然后以反序显示该字符串。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = scan.next();
s = reverseStr(s);
System.out.println(s);
s = reverseStr1(s);
System.out.println(s);
}
private static String reverseStr(String s) {
int left = 0, right = s.length() - 1;
String s1 = "", s2 = "";
while (left < right) {
// char temp = s.charAt(left);
// s.charAt(left) = s.charAt(right); // String对象不可变
// s.charAt(right) = temp;
s1 = s.charAt(left) + s1;
s2 = s2 + s.charAt(right);
left++;
right--;
}
return s = s2 + (s.length() % 2 == 0 ? "": s.charAt(left)) + s1;
}
private static String reverseStr1(String s) {
StringBuilder stringBuilder = new StringBuilder(s);
int left = 0, right = s.length() - 1;
while (left < right) {
// StringBuilder对象不可变
stringBuilder.setCharAt(left, s.charAt(right));
stringBuilder.setCharAt(right, s.charAt(left));
left++;
right--;
}
return stringBuilder.toString();
}
}
结果:
下面是一个运行示例:
package Exer;
import java.util.Scanner;
public class Demo63 {
/*
Demo63 (商业:检测ISBN-13 ) ISBN-13是一个标识书籍的新标准。
它使用13位数字d1d2d3d4d5d6d7d8d9d10d11d12d13。最后一位数字d13,是一个校验和,
是使用下面的公式从其他数字中计算出来的:
10-(d1 + 3d2 + d3 + 3d4 + d5+ 3d6 + d7 + 3d8 + d9 + 3d10 + d11 + 3d12 )%10,
如果校验和为10,将其替换为0。程序应该将输入作为一个字符串读人。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入ISBN的前12位:");
String s = scan.next();
if (s.length() < 12) {
System.out.println("输入的是无效的!");
} else {
printISBN(s);
}
scan.close();
}
private static void printISBN(String s) {
int[] d = findD(s);
int sum = 0;
// System.out.println(Arrays.toString(d));
for (int i = 0; i < d.length; i++) {
sum += i % 2 == 0 ? d[i]: 3 * d[i];
}
int d13 = 10 - sum % 10;
System.out.println("ISBN号为:" + s + (d13 == 10 ? 0: d13));
}
private static int[] findD(String s) {
int[] d = new int[12];
long isbn = Long.parseLong(s);
for (int i = d.length - 1; i >= 0; i--) {
d[i] = (int)(isbn % 10);
isbn /= 10;
}
return d;
}
}
结果:
下面是一个运行示例:
import java.util.Scanner;
public class Demo64 {
/*
Demo64 (处理字符串)编写一个程序,提示用户输入一个字符串,显示奇数位置的字符。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String s = scan.nextLine();
String temp = "";
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0) {
temp += s.charAt(i);
}
}
System.out.println(temp);
scan.close();
}
}
结果:
package Exer;
import java.util.Scanner;
public class Demo65 {
/*
Demo65 (对大写字母计数)编写一个程序,提示用户输入一个字符串,然后显示该字符串中大写字母的数目。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str = scan.nextLine();
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') {
count++;
}
}
System.out.println("字符串中大写字母的数目为:" + count);
}
}
结果:
下面是运行示例:
这里使用暴力破解法和,使用startsWith()方法两种方法求解:
package Exer;
import java.util.Scanner;
public class Demo66 {
/*
Demo66 (最长的共同前缀)编写一个程序,提示用户输入两个字符串,显示两个字符串最长的共同前缀。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入第一个字符串:");
String s1 = scan.nextLine();
System.out.print("请输入第二个字符串:");
String s2 = scan.nextLine();
commonPrefix(s1, s2);
commonPrefix1(s1, s2);
}
private static void commonPrefix(String s1, String s2) {
String minStr = s1.length() < s2.length() ? s1 : s2;
int i;
for (i = 0; i < minStr.length(); i++) {
if (s1.charAt(i) != s2.charAt(i)) {
break;
}
}
if (i == 0) {
System.out.println(s1 + " and " + s2 + "没有共同前缀!");
} else {
System.out.println("共同的前缀是:" + minStr.substring(0, i));
}
}
private static void commonPrefix1(String s1, String s2) {
String minStr = s1.length() < s2.length() ? s1 : s2;
String maxStr = s1.length() > s2.length() ? s1 : s2;
while (!maxStr.startsWith(minStr)) {
minStr = minStr.substring(0, minStr.length() - 1);
if (minStr.length() == 0) {
break;
}
}
if (minStr.isEmpty()) {
System.out.println(s1 + " and " + s2 + "没有共同前缀!");
} else {
System.out.println("共同的前缀是:" + minStr);
}
}
}
结果:
提示:使用求余操作符 % 提取数字,用除号 / 去掉提取出来的数字。例如:使用234%10(=4)抽取4。然后使用234/10 ( =23 )从234中去掉4。使用一个循环来反复提取和去掉每位数字,直到所有的位数都提取完为止。
package Exer;
import java.util.Scanner;
public class Demo67 {
/*
(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。
使用下面的方法头:public static int sumDigits(long n),
例如: sumDigits(234)返回9(2+3+4)。编写程序提示用户输入一个整数,然后显示这个整数所有数字的和。
提示:使用求余操作符 % 提取数字,用除号 / 去掉提取出来的数字。
例如:使用234%10(=4)抽取4。然后使用234/10 ( =23 )从234中去掉4。
使用一个循环来反复提取和去掉每位数字,直到所有的位数都提取完为止。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个整数:");
long num = scan.nextLong();
int sum = sumDigits(num);
System.out.println(sum);
}
// 循环
private static int sumDigits(long n) {
int sum = 0;
while (n > 0) {
sum += (int)(n % 10);
n /= 10;
}
return sum;
}
// 递归
private static int sumDigits1(long n) {
// int sum = 0;
if (n > 0 && n < 10) {
return (int)(n % 10);
}
return (int)(n % 10) + sumDigits1(n / 10);
}
}
结果:
// Return the reversal of an integer,i.e.,reverse(456) returns 654
public static int reverse(int number)
//Return true if number is a palindrome
public static boolean isPalindrome(int number)
package Exer;
import java.util.Scanner;
public class Demo68 {
/*
(回文整数)使用下面的方法头编写两个方法,使用reverse方法实现isPalindrome。
如果一个数字的反向倒置数和它的顺向数一样,这个数就称作回文数。
编写一个测试程序,提示用户输人一个整数值,然后报告这个整数是否是回文数。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = scan.nextInt();
if (isPalindrome(num)) {
System.out.println(num + " 是回文数");
}else {
System.out.println(num + " 不是回文数");
}
scan.close();
}
// Return the reversal of an integer,i.e.,reverse(456) returns 654
public static int reverse(int number){
int reverseNum = 0;
while (number > 0) {
reverseNum *= 10;
if (number % 10 == number) {
return number + reverseNum;
}else {
reverseNum += (number % 10);
}
number /= 10;
}
return reverseNum;
}
// Return true if number is a palindrome
public static boolean isPalindrome(int number) {
// System.out.println(reverse(number));
return reverse(number) == number;
}
}
结果:
package Exer;
import java.util.Scanner;
public class Demo69 {
/*
Demo69 (显示0和1构成的矩阵)编写一个方法,使用下面的方法头显示n x n的矩阵:
pub1ic static void printMatrix(int n),每个元素都是随机产生的0或1。
编写一个测试程序,提示用户输入n,显示如下所示的n xn矩阵:
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入要打印一个n x n的矩阵的n:");
int n = scan.nextInt();
printMatrix(n);
scan.close();
}
public static void printMatrix(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print((int)(Math.random() * 2) + " ");
}
System.out.println();
}
}
}
结果:
假定密码规则如下:
package Exer;
import java.util.Scanner;
public class Demo70 {
/*
(检测密码) 一些网站对于密码具有一些规则。编写一个方法,检测字符串是否是一个有效密码。
编写一个程序,提示用户输入一个密码,如果符合规则,则显示valid Password,否则显示Invalid Password。
假定密码规则如下:
1. 密码必须至少8位字符。
2. 密码仅能包含字母和数字。
3. 密码必须包含至少两个数字。
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入密码:");
String password = scan.next();
if (judgePassword(password)) {
System.out.println("valid Password!");
} else {
System.out.println("Invalid Password!");
}
scan.close();
}
private static boolean judgePassword(String password) {
if (password.length() < 8) {
return false;
} else {
int count = 0;
for (int i = 0; i < password.length(); i++) {
if (!(Character.isDigit(password.charAt(i)) || Character.isLetter(password.charAt(i)))) {
return false;
} else if (Character.isDigit(password.charAt(i))) {
count++;
}
}
return count >= 2;
}
}
}
结果: