javaSE-基本语法-练习题

求二个二进制的和

  • 编程1:求二个二进制的和: 给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

    /*
     * 注意:a 和 b 仅由字符 '0' 或 '1' 组成
     *  
     * 示例 1:
     * 		输入:a = "11", b = "1"
     * 		输出:"100"
     * 示例 2:
     * 		输入:a = "1010", b = "1011"
     * 		输出:"10101"
     */
    public String addBinary(String a, String b) {
    
    }
    
  • 方式1:老师讲的版本

    package com.czxy;
    
    /**
     * @author 桐叔
     * @email [email protected]
     * @description
     */
    public class Test02_addBinary {
    
        public static void main(String[] args) {
            testStringBuilder();
            System.out.println(addBinary("11","1"));            //100
            System.out.println(addBinary("1010","1011"));       //10101
            System.out.println(addBinary("111011","1010"));     //1000101
        }
    
        /*
         * 注意:a 和 b 仅由字符 '0' 或 '1' 组成
         *
         * 示例 1:
         * 		输入:a = "11", b = "1"
         * 		输出:"100"
         * 示例 2:
         * 		输入:a = "1010", b = "1011"
         * 		输出:"10101"
         */
        public static String addBinary(String a, String b) {
            // 定义变量、记录所有计算结果
            StringBuilder sb = new StringBuilder();
    
            // 定义i和j分别记录两个字符串的高位
            int i = a.length() - 1;
            int j = b.length() - 1;
            // 保存进位
            int c = 0;
            // 循环处理,从右往左进行计算
            while(i >= 0 || j >= 0 || c != 0) {
                // 依次获取i和j位置的数字
                int ii = (i >= 0) ? a.charAt(i--) - '0' : 0;
                int jj = (j >= 0) ? b.charAt(j--) - '0' : 0;
                // 记录当前位的和
                c = ii + jj + c;
                // 记录结果:c=1 -->1  , c=0 --> 0   c==2 --> 0 (进位)
                sb.append(c % 2);
                // 是否进位 c=2 -->1(进位)  c=1 -->0 (不进位)  c=0 --> 0 (不进位)
                c /=2;
            }
            //sb记录的数为倒序,需要反转
            return sb.reverse().toString();
        }
    
        public static void testStringBuilder() {
            // StringBuilder 用于拼凑字符串 工具类
            StringBuilder sb = new StringBuilder();
            sb.append("a");
            sb.append('a');
            sb.append(98);
    
            // 其他功能:反转
            sb.reverse();
    
            // 将所有内容 转换成 字符串
            String str = sb.toString();
            System.out.println(str);
        }
    }
    
    
  • 方式2:胡锦宁的版本

    //编程1:求二个二进制的和: 给你两个二进制字符串 `a` 和 `b` ,以二进制字符串的形式返回它们的和。
    public static String binarySystem (String a,String b) {
       return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2));
    }
    

罗马数字转换成整数

  • 编程2:将罗马数字转换成整数

    /**
    示例 1:
        输入: s = "III"
        输出: 3
        
    示例 2:
        输入: s = "IV"
        输出: 4
        
    示例 3:
        输入: s = "IX"
        输出: 9
        
    示例 4:
        输入: s = "LVIII"
        输出: 58
    	解释: L = 50, V= 5, III = 3.
    	
    示例 5:
        输入: s = "MCMXCIV"
        输出: 1994
        解释: M = 1000, CM = 900, XC = 90, IV = 4.
     */
    public int romanToInt(String s) {
    
    }
    
    /*规则
    1 基本对应关系:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
            字符          数值
            I             1
            V             5
            X             10
            L             50
            C             100
            D             500
            M             1000
       例如,
       		罗马数字2写做II,即为两个并列的1。
       		12 写做 XII ,即为 X + II 。 
       		27 写做  XXVII, 即为 XX + V + II 。
    2 特例:特殊的规则只适用于以下六种情况
    	I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    	X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
    	C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
    	例如:
    		数字4不写做IIII,而是IV。数字1在数字5的左边,表示大数5减小数1得到的数值4。
    */
    
    package com.czxy;
    
    /**
     * 在线罗马数转换器:
     *  https://miniwebtool.com/zh-cn/roman-numerals-converter/?number=4999#google_vignette
     * @author 桐叔
     * @email [email protected]
     * @description
     */
    public class Test03_romanToInt {
        public static void main(String[] args) {
            System.out.println(romanToInt("III"));      //3
            System.out.println(romanToInt("IV"));       //4
            System.out.println(romanToInt("IX"));       //9
            System.out.println(romanToInt("LVIII"));    //58
            System.out.println(romanToInt("MCMXCIV"));  //1994
            System.out.println(romanToInt("MMMMCMXCIX"));  //4999
        }
    
        /**
         示例 1:
         输入: s = "III"
         输出: 3
    
         示例 2:
         输入: s = "IV"
         输出: 4
    
         示例 3:
         输入: s = "IX"
         输出: 9
    
         示例 4:
         输入: s = "LVIII"
         输出: 58
         解释: L = 50, V= 5, III = 3.
    
         示例 5:
         输入: s = "MCMXCIV"
         输出: 1994
         解释: M = 1000, CM = 900, XC = 90, IV = 4.
         */
        public static int romanToInt(String s) {
            /* 提前使用preNum变量存放一个数据,用于与后面的数据进行比较
             如果小于后面的数据,将进行的-操作
             如果大于等于后面的数据,将进行的+操作
             使用perNum进行所有数据的累加/减操作
             */
            //1 累加/减操作变量
            int sum = 0;
            //2 定义preNum,用于存放第一个字符
            int preNum = getValue(s.charAt(0));
            //3 从索引号1开始(第二字符),依次与preNum进行比较
            for(int i = 1 ; i < s.length() ; i ++) {
                // 3.1 获得字符对应的水珠
                int num = getValue(s.charAt(i));
                // 3.2 比较
                if(preNum < num) {
                    sum -= preNum;
                } else {
                    sum += preNum;
                }
                // 3.3 数据依次下移,将preNum存放num
                preNum = num;
            }
            //4 累加最后一个值
            sum += preNum;
            // 5 返回
            return sum;
        }
    
        public static int getValue(char ch){
            switch(ch) {
                case 'I':  return 1;
                case 'V':  return 5;
                case 'X':  return 10;
                case 'L':  return 50;
                case 'C':  return 100;
                case 'D':  return 500;
                case 'M':  return 1000;
                default: return 0;
            }
        }
    }
    
    
  • 方式2:胡锦宁的版本

    //    编程2:将罗马数字转换成整数
        public static int romanToInt(String s) {
    //        创建一个Map集合,用于存储数据
            Map<Character, Integer> map = new HashMap<>();
            map.put('I',1);
            map.put('V',5);
            map.put('X',10);
            map.put('L',50);
            map.put('C',100);
            map.put('D',500);
            map.put('M',1000);
            int sum = 0;
            for(int i = 0; i < s.length();i ++){
                //无论什么符号都先加
                sum += map.get(s.charAt(i));
                if(map.get(s.charAt((i - 1)< 0 ? i : i-1)) < map.get(s.charAt(i))){
                    //需要减的符号减2次(1次之前加了,1次自己需要减)
                    sum =sum - map.get(s.charAt(i-1)) * 2;
                }
            }
            return sum;
        }
    

你可能感兴趣的:(java,算法,开发语言)