力扣Day24

387、字符串中的第一个唯一字符 

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

提示:你可以假定该字符串只包含小写字母。

 

class Solution {
    public int firstUniqChar(String s) {
        Map<Character,Integer>map=new HashMap<>();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(!map.containsKey(c)){
                map.put(c,1);
            }else{
                map.put(c,map.get(c)+1);
            }
        }
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(map.get(c)==1){
                return i;
            }
        }
        return -1;
    }
}

1748、唯一元素的和

给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。请你返回 nums 中唯一元素的

 法一:利用数组计数并求和(Day18的409也用到数组计数)

定义一个新数组,数组的索引是nums数组的值,而数组对应索引的值是计入nums数组的值的次数

class Solution {
    public int sumOfUnique(int[] nums) {
        //1 <= nums[i] <= 100(题目规定)
        int[] counts = new int[101];//所以定义为count长度为101
        int sum = 0;
        for(int n:nums){
            if(counts[n]++==0){
                sum+=n;
            }else if(counts[n]==2){
                sum-=n;
            }
        }
        return sum;
    }
}

法二:哈希表

class Solution {
    public int sumOfUnique(int[] nums) {
        Map<Integer,Integer>map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(nums[i])){
                map.put(nums[i],map.get(nums[i])+1);
            }else{
                map.put(nums[i],1);
            }
        }
        int sum=0;
        for(int i:nums){
            if(map.get(i)==1){
                sum+=i;
            }
        }
        return sum;
    }
}

415、字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

方法:模拟数学加法运算

思路及注意点:

1、 Char类型可以进行加减乘除的运算,可以想到将String中的每个字符转换为char类型进行计算 

2、add!=0是防止两个个位数相加,但是满10进1没有算进去(eg:1+9=10 如果没有add!=0输出为0)

3、int x,y的形式利用了三元符:用三元运算符是保证不会出现String越界(即不会出现String index out of range: -1)

4、num1.charAt(i) - '0' 得到的就是数字————num1.charAt(i)得到的就是数字对应的ASCII值,减去 '0'就是减去0对应的ASCII值,那么就是得到数字(0的ASCII是48、  9的ASCII是57。数字的ASCII值只有0~9这十位)

class Solution {
    public String addStrings(String num1, String num2) {
        //Char类型可以进行加减乘除的运算,可以想到将String中的每个字符转换为char类型进行计算
        int i = num1.length() - 1;//模拟数学加法运算
        int j = num2.length() - 1;
        int add = 0;//满10进1
        StringBuffer ans = new StringBuffer();
        while (i >= 0 || j >= 0||add!=0 ) {
            //add!=0是防止两个个位数相加,但是满10进1没有算进去(eg:1+9=10 如果没有add!=0输出为0)
            //num1.charAt(i) - '0' 得到的就是数字
            //用三元运算符是保证不会出现String越界
            //不会出现String index out of range: -1
            int x = i >= 0 ? num1.charAt(i) - '0' : 0;
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;
            int result = x + y + add;
            ans.append(result % 10);//每次都把个位数添加进来
            add = result / 10;//满10进1
            i--;
            j--;
        }
        // 计算完以后的答案需要翻转过来
        ans.reverse();
        return ans.toString();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值