第四章习题解析(二)

注:s.leng()和s.leng的区别:

s.length是针对java中数组的,length是数组的一个属性,用来表示数组的长度

s.length()则是字符串的一个方法,用来返回字符串的长度的

字符串是没有length属性的,只有length()方法

数组有length属性,而没有length()方法

 题目分析:首先提示用户输入密码,当用户输入密码后,对密码进行判断,从密码的长度,组成以及是不是所含数字大于等于2,如果这三个条件都满足那么这个密码是合法的,若出现有一个不符合,密码都是非法的。

注:定义字符串用s.nextLine()

import java.util.*;
class test4{
    public static void main(String[] args){
        //1.提示用户输入密码(String password)
        Scanner s=new Scanner(System.in);
        System.out.print("请输入密码");
        String password=s.nextLine();
        //2.将密码传入 boolean isValid(password)
        if(isValid(password)){//假设我们已经写了isValid这个函数
            System.out.println("密码规范");
        }else{
            System.out.println("密码不规范");
        }
    }
    //3.isValid()
        //3.1长度 isLength
        //3.2组成 isContant
            //3.2.1 isLetter 判断字母
            //3.2.2 isDigit  判断数字
        //3.3特殊至少两数字 isNum   isDigit
        public static boolean isValid(String s){
            return isLength(s)&&isContant(s)&&isNum(s);//return指的是返回为true
        }
        public static boolean isLength(String s){//判断d长度是否大于等于8
            return s.length()>=8;
        }
        public static boolean isContant(String s){
            char c=' ';//定义一个新的字符
            for(int i=0;i<s.length();i++){
                 c=s.charAt(i);//获取角标为i位置的字符,返回的是字符
                 if(!isLetter(c)&&!isDigit(c)){
                   return false;
            }
        }
          return true;
    }
    public static boolean isLetter(char c){
           return c>'a'&&c<'z'||c>'A'&&c<'z';
    }
    public static boolean isDigit(char c){
           return c>'0'||c<'9';
    }
    public static boolean isNum(String s){
        int count=0;
        char c=' ';
        for(int i=0;i<s.length();i++){
            if(isDigit(c)){
                c=s.charAt(i);
                count++;
            }
        }
        return count>=2;
    }
}

 

 题目分析:题目要求输出两个子串的最长共同前缀,我的想法是,先定义两个字符串,比较两个字串的大小,比较出来之后开始从角标0遍历两个字符串,当出现字符不一样的时候,截取子串,返回截取的小串,这个小串就是共同子串

截取子串:s.substring(0,i)意思是截取s中从角标0到角标i的子串

import java.util.*;
class test11{
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        System.out.print("请输入字符串");
        String s1=s.nextLine();
        System.out.print("请输入字符串");
        String s2=s.nextLine();
        System.out.println(getCommonPrefix(s1,s2));
    }
    public static String getCommonPrefix(String s1,String s2){//共同前缀
        //先判断s1,s2两个串的大小
        String minStr="";
        String maxStr="";
        if(s1.length()<=s2.length()){
            minStr=s1;
            maxStr=s2;
        }else{
            minStr=s2;
            maxStr=s1;
        }
        for(int i=0;i<minStr.length();i++){
            if(minStr.charAt(i)!=maxStr.charAt(i)){
                return minStr.substring(0,i);//截取小串,从角标0开始到角标i结束
            }
        }
        return minStr;
}

 

 题目分析:以AB8C分析,转化为为十进制是A*16^3+B*16^2+8*16^1+C*16^0

幂的变化为 3   2   1   0

角标的变化 0    1   2   3

我们就会发现:角标=串的长度-1-幂

我们从幂=0开始遍历,就会得出对应角标的字符,我们在十六进制中会发现,它会出现A~F的字符,我们就要对遍历之后的字符进行换算,我们都知道 A=10 B=11 C=12 D=13 E=14 F=15,我们就可以用(c-'A'+10)它就代表获取到的字符与A之间的差+10 就能将该字符化为数字

import java.util.*;
class test12{
    public static void main(String[] args){
         Scanner s=new Scanner(System.in);
         System.out.print("请输入十六进制数");
         String hex=s.nextLine();
         System.out.println(hexToDecimal(hex));
    }
    public static int hexToDecimal(String hex){
        int num=0;
        char c=' ';
        for(int i=0;i<hex.length();i++){
            c=hex.charAt(hex.length()-1-i);
            if(isLetter(c)){
                num+=(c-'A'+10)*Math.pow(16,i);
            }else{
                num+=(c-'0')*Math.pow(16,i);
            }
        }
         return num;
    }
    public static boolean isLetter(char c){
        return c>='A'&&c<='F';
    }
}
发布了21 篇原创文章 · 获赞 0 · 访问量 358

猜你喜欢

转载自blog.csdn.net/weixin_44318477/article/details/104347545