目录
Demo61 (检查SSN)编写一个程序,提示用户输入一个社保号码,它的格式是DDD-DD-DDDD,其中D是一个数字。你的程序应该判断输入是否合法。
Demo62 (倒排一个字符串)编写一个程序,提示用户输人一个字符串,然后以反序显示该字符串。
Demo64 (处理字符串)编写一个程序,提示用户输入一个字符串,显示奇数位置的字符。
Demo65 (对大写字母计数)编写一个程序,提示用户输入一个字符串,然后显示该字符串中大写字母的数目。
Demo66 (最长的共同前缀)编写一个程序,提示用户输入两个字符串,显示两个字符串最长的共同前缀。
下面是一个运行示例:

- 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;
- }
- }
- }
结果:


