JZ50、JZ57、JZ56

文章介绍了三种Java编程题目的解决方案:使用哈希表找到字符串中第一个只出现一次的字符,双指针法找到数组中和为给定值的两个数字,以及通过哈希表和异或运算找出数组中只出现一次的两个数字。这些方法的时间复杂度均为O(n),并展示了不同的数据结构和算法应用。
摘要由CSDN通过智能技术生成

JZ50 第一个只出现一次的字符

题源 👉 第一个只出现一次的字符_牛客题霸_牛客网 (nowcoder.com)

题目描述:

image-20230213160501714

具体实现:

方法一:哈希表

import java.util.*;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        Map<Character,Integer> map = new HashMap<>();
        for(int i = 0; i < str.length(); i++)
            map.put(str.charAt(i), map.getOrDefault(str.charAt(i), 0)+1);
        for(int i = 0; i < str.length(); i++){
            if(map.get(str.charAt(i)) == 1)
                return i;
        }
        return -1;
    }
}

时间:O(n)

空间:O(1) 哈希表大小不会超过字符集(52个字符),属常数空间


JZ57 和为S的两个数字

题源 👉 和为S的两个数字_牛客题霸_牛客网 (nowcoder.com)

题目描述:

image-20230213170055899

具体实现:

  • 方法一:双指针
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        int l = 0, r = array.length - 1;
        ArrayList<Integer> list = new ArrayList<>();
        while(l < r){
            int a = array[l] + array[r];
            if(a == sum){
                list.add(array[l]);
                list.add(array[r]);
                return list;
            }else if(a < sum){
                l++;
            }else{
                r--;
            }
        }
        return list;
    }
}

时间:O(n)

空间:O(1)


JZ56 数组中只出现一次的两个数字

题源 👉 数组中只出现一次的两个数字_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=265&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D265&difficulty=&judgeStatus=&tags=&title=最小的k个数&gioEnter=menu)

题目描述

image-20230213170803774

具体实现:

方法一:哈希表

import java.util.*;


public class Solution {
    public int[] FindNumsAppearOnce (int[] array) {
        int[] ans = new int[2];
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < array.length; i++)
            map.put(array[i], map.getOrDefault(array[i], 0)+1);
        for(int i = 0, j = 0; i < array.length; i++){
            if(j == 2) break;
            if(map.get(array[i]) == 1)
                ans[j++] = array[i];
        }
        if(ans[0] > ans[1]){
            int temp = ans[0];
            ans[0] = ans[1];
            ans[1] = temp;
        }
        return ans;
    }
}

时间:O(n)

空间:O(n)


方法二:异或运算 源自官方题解👉 题解 | #数组中只出现一次的两个数字#_牛客博客 (nowcoder.net)

image-20230213211048176

image-20230213211106587

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值