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();
}
}