外包軟件開發(fā)一鍵優(yōu)化軟件
刷題順序及思路來源于代碼隨想錄,網(wǎng)站地址:https://programmercarl.com
202.?快樂數(shù)?
編寫一個算法來判斷一個數(shù)?n
?是不是快樂數(shù)。
「快樂數(shù)」?定義為:
- 對于一個正整數(shù),每一次將該數(shù)替換為它每個位置上的數(shù)字的平方和。
- 然后重復(fù)這個過程直到這個數(shù)變?yōu)?1,也可能是?無限循環(huán)?但始終變不到 1。
- 如果這個過程?結(jié)果為?1,那么這個數(shù)就是快樂數(shù)。
如果?n
?是?快樂數(shù)?就返回?true
?;不是,則返回?false
?。
輸入:n = 19
輸出:true
解釋:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;/*** @author light* @Description 快樂數(shù)* 編寫一個算法來判斷一個數(shù) n 是不是快樂數(shù)。** (題目中說了會 無限循環(huán),那么也就是說求和的過程中,sum會重復(fù)出現(xiàn),這對解題很重要!* @create 2023-08-02 11:30*/
public class IsHappyTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();boolean res=isHappy(n);System.out.println(res);}public static boolean isHappy(int n) {Set<Integer> set=new HashSet<>();while(n!=1&&!set.contains(n)){set.add(n);n=getNextNum(n);}return n==1;}private static int getNextNum(int n) {int sum=0;int temp;while(n!=0){temp=n%10;sum+=temp*temp;n=n/10;}return sum;}
}
1.?兩數(shù)之和
給定一個整數(shù)數(shù)組?nums
?和一個整數(shù)目標(biāo)值?target
,請你在該數(shù)組中找出?和為目標(biāo)值?target
? 的那?兩個?整數(shù),并返回它們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,數(shù)組中同一個元素在答案里不能重復(fù)出現(xiàn)。
你可以按任意順序返回答案。
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因?yàn)?nums[0] + nums[1] == 9 ,返回 [0, 1] 。
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;/*** @author light* @Description 兩數(shù)之和** 什么時候使用哈希法:需要查詢一個元素是否出現(xiàn)過,或一個元素是否在集合里的時候,需要考慮哈希法* @create 2023-08-02 11:58*/
public class TwoSumTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < nums.length; i++) {nums[i]=input.nextInt();}int target=input.nextInt();int[] res=twoSum(nums,target);System.out.println(Arrays.toString(res));}public static int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map=new HashMap<>();int[] res=new int[2];int temp;for (int i = 0; i < nums.length; i++) {temp=target-nums[i];if(map.containsKey(temp)){res[0]=i;res[1]=map.get(temp);}//key:數(shù)組元素值;value:數(shù)組元素下標(biāo)map.put(nums[i],i);}return res;}
}
454.?四數(shù)相加 II
給你四個整數(shù)數(shù)組?nums1
、nums2
、nums3
?和?nums4
?,數(shù)組長度都是?n
?,請你計(jì)算有多少個元組?(i, j, k, l)
?能滿足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
輸入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
輸出:2
解釋:
兩個元組如下:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;/*** @author light* @Description 四數(shù)相加 II** @create 2023-08-02 12:30*/
public class FourSumCountTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums1=new int[n];int[] nums2=new int[n];int[] nums3=new int[n];int[] nums4=new int[n];for (int i = 0; i < nums1.length; i++) {nums1[i]=input.nextInt();}for (int i = 0; i < nums2.length; i++) {nums2[i]=input.nextInt();}for (int i = 0; i < nums3.length; i++) {nums3[i]=input.nextInt();}for (int i = 0; i < nums4.length; i++) {nums4[i]=input.nextInt();}int res=fourSumCount(nums1,nums2,nums3,nums4);System.out.println(res);}public static int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {Map<Integer,Integer> map=new HashMap<>();int count=0;int temp1;int temp2;for (int i = 0; i < nums1.length; i++) {for (int j = 0; j < nums2.length; j++) {temp1=nums1[i]+nums2[j];map.put(temp1,map.getOrDefault(temp1,0)+1);}}for (int i = 0; i < nums3.length; i++) {for (int j = 0; j < nums4.length; j++) {temp2=0-(nums3[i]+nums4[j]);if(map.containsKey(temp2)){count+=map.get(temp2);}}}return count;}
}
383.?贖金信
給你兩個字符串:ransomNote
?和?magazine
?,判斷?ransomNote
?能不能由?magazine
?里面的字符構(gòu)成。
如果可以,返回?true
?;否則返回?false
?。
magazine
?中的每個字符只能在?ransomNote
?中使用一次。
輸入:ransomNote = "a", magazine = "b"
輸出:false
import java.util.Scanner;/*** @author light* @Description 贖金信* @create 2023-08-02 13:10*/
public class CanConstructTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);String ransomNote=input.next();String magazine=input.next();boolean res=canConstruct(ransomNote,magazine);System.out.println(res);}public static boolean canConstruct(String ransomNote, String magazine) {if(magazine.length()<ransomNote.length()){return false;}int[] nums=new int[26];for (int i = 0; i < magazine.length(); i++) {nums[magazine.charAt(i)-'a']++;}for (int i = 0; i < ransomNote.length(); i++) {nums[ransomNote.charAt(i)-'a']--;if(nums[ransomNote.charAt(i)-'a']<0){return false;}}return true;}
}
15.?三數(shù)之和
給你一個整數(shù)數(shù)組?nums
?,判斷是否存在三元組?[nums[i], nums[j], nums[k]]
?滿足?i != j
、i != k
?且?j != k
?,同時還滿足?nums[i] + nums[j] + nums[k] == 0
?。請
你返回所有和為?0
?且不重復(fù)的三元組。
注意:答案中不可以包含重復(fù)的三元組。
輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
解釋:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。
注意,輸出的順序和三元組的順序并不重要。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 三數(shù)之和* * (采用雙指針法* @create 2023-08-02 13:31*/
public class ThreeSumTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < nums.length; i++) {nums[i]=input.nextInt();}List<List<Integer>> list=threeSum(nums);System.out.println(list);}public static List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res=new ArrayList<>();//先對數(shù)組進(jìn)行排序Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if(nums[i]>0){return res;}//對a去重 (a+b+c=0)//因?yàn)橐呀?jīng)排序過了,只要a前面有一樣的,接下來的abc要么是和前面重復(fù)的,// 要么就找不到這組了。bc同理只要重復(fù)一次就重復(fù)了int left=i+1;int right= nums.length-1;if(i>0&&nums[i]==nums[i-1]){continue;}while(right>left){if(nums[i]+nums[left]+nums[right]>0){right--;} else if (nums[i]+nums[left]+nums[right]<0) {left++;}else{//找到一對三元組,將三元組加入集合中res.add(Arrays.asList(nums[i],nums[left],nums[right]));//對bc去重while(right>left&&nums[left]==nums[left+1]){left++;}while(right>left&&nums[right]==nums[right-1]){right--;}//找到三元組后left和right同時移動left++;right--;}}}return res;}
}
18.?四數(shù)之和
給你一個由?n
?個整數(shù)組成的數(shù)組?nums
?,和一個目標(biāo)值?target
?。請你找出并返回滿足下述全部條件且不重復(fù)的四元組?[nums[a], nums[b], nums[c], nums[d]]
?(若兩個四元組元素一一對應(yīng),則認(rèn)為兩個四元組重復(fù)):
0 <= a, b, c, d?< n
a
、b
、c
?和?d
?互不相同nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按?任意順序?返回答案 。
輸入:nums = [1,0,-1,0,-2,2], target = 0
輸出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 四數(shù)之和** (雙指針* @create 2023-08-02 15:34*/
public class FourSumTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < nums.length; i++) {nums[i]=input.nextInt();}int target=input.nextInt();List<List<Integer>> res=fourSum(nums,target);System.out.println(res);}public static List<List<Integer>> fourSum(int[] nums, int target) {//a+b+c+d=target//對數(shù)組進(jìn)行排序Arrays.sort(nums);List<List<Integer>> res=new ArrayList<>();for (int i = 0; i < nums.length; i++) {//一級剪枝if(nums[i]>0&&nums[i]>target){return res;}//一級去重if(i>0&&nums[i]==nums[i-1]){continue;}for (int j = i+1; j < nums.length; j++) {//二級剪枝if(nums[i]+nums[j]>0&&nums[i]+nums[j]>target){break;}//二級去重if(j>i+1&&nums[j]==nums[j-1]){continue;}int left=j+1;int right= nums.length-1;while(right>left){long sum=(long)(nums[i]+nums[j]+nums[left]+nums[right]);if(sum>target){right--;} else if (sum<target) {left++;}else{//找到a+b+c+d=target的四元組res.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));//對left、right去重while(right>left&&nums[left]==nums[left+1]){left++;}while (right>left&&nums[right]==nums[right-1]){right--;}left++;right--;}}}}return res;}
}