软工一 Java homework practice 3

P1:计算一个整数在二进制表示下的补数

public class NumberComplement {

   public static int findComplement(int num) {

      if (num<0)
         return minnum(num);
      else if (num>0)
         return posnum(num);
      else
         return 1;
    }

负数取补直接用了数学方法-n-1

//数学方法
    private static int minnum(int n){
      return -n-1;
   }

正数方面用了ArrayList拆分再组合的方法(同数学计算)

sum += Math.pow(2,ron++)*Math.abs(i-1);
   private static int posnum(int n){
      ArrayList<Integer> list = new ArrayList<>();
      //list中最前面的是最低位
      for (;n!=0;){
         int rest;
         rest = n % 2;
         if(rest==1)
            list.add(1);
         else
            list.add(0);
         n /= 2;
      }
      int ron = 0,sum = 0;
      for (Integer i:list){
         sum += Math.pow(2,ron++)*Math.abs(i-1);
      }
      return sum;
   }
}

P3 P4 P5:在一个字符数组中,除了某一个字符只出现一次外,其他字符都出现过两次,请找出只出现一次的字符。

**这题有个知识点遗漏-->

在判断char[] 为空时

char[] p = {};
if ((characters.equals(p))||(characters.length==0)||(characters==null))
   return '\0';

这样写可能会报错,因为当char[] chs== null时 chs.length会抛出异常java.lang.NullPointerException: null

改正:

char[] p = {};
if ((characters==null)||(characters.equals(p)))
   return '\0';

将characters==null?提前,直接删除character.length

(只要出现character.length就会抛异常)

---------------------------------------------

java.lang.NullPointerException: null

调用 null 对象的实例方法。
访问或修改 null 对象的字段。
将 null 作为一个数组,获得其长度。
将 null 作为一个数组,访问或修改其时间片。

将 null 作为 Throwable 值抛出

---------------------------------------------

P3:嵌套循环

public class SingleCharacterI {

   public static char singleNumber(char[] characters) {

      char[] p = {};
      if ((characters==null)||(characters.equals(p)))
         return '\0';
      int len = characters.length;
      for (int i=0;i < len;i ++){
         boolean bool = true;
         for (int j=0; j < len;j ++){
            if((characters[i]==characters[j])&&(j != i)){
               bool = false;
               break;
            }
         }
         if(bool)
            return characters[i];
         bool = true;
      }
      return '\0';
   }
}

P4:哈希表(结果可能为多个char的做法)

map.put(Character.toString(ch),num==null?1:num+1);
——————————————————————————————————————————————————————————

public class SingleCharacterII {

   public static char singleNumber(char[] characters) {

      char[] p = {};
      if ((characters==null)||(characters.equals(p)))
         return '\0';

      Map<String,Integer> map = new HashMap<String, Integer>();

//        将char数组 转换为HashMap
      for (char ch : characters){
         Integer num = map.get(Character.toString(ch));
         map.put(Character.toString(ch),num==null?1:num+1);
      }
//      得到键值对
      for (String key:map.keySet()){
         if (map.get(key)==1){
            return key.toCharArray()[0];
         }
      }
      return '\0';
    }
}

P5:异或法

public class SingleCharacterIII {

   public static char singleNumber(char[] characters) {
      char[] p = {};
      if ((characters==null)||(characters.equals(p)))
         return '\0';
      char ans = 0;
      for (int i=0;i < characters.length;i ++)
         ans ^= characters[i];
      return ans;
   }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值