functwoSum(nums []int, target int)[]int{m :=make(map[int]int)for i, num :=range nums {diff := target - numif_, ok := m[diff]; ok {return[]int{m[diff], i}}m[num]= i}returnnil}
2. 兩數平方和
題目描述:判斷一個數是否為兩個數的平方和。
java
publicbooleanjudgeSquareSum(int C){int i =0, j =(int) Math.sqrt(C);while(i <= j){int sum = i * i + j * j;if(sum == C)returntrue;elseif(sum < C)i++;elsej--;}returnfalse;}
go版
funcjudgeSquareSum(c int)bool{i, j :=0,int(math.Sqrt(float64(c)))for i <= j {target := i*i + j*jif target == c {returntrue}elseif target < c {i++}elseif target > c {j--}}returnfalse}
3. 反轉字符串中的元音字符
使用雙指針指向待反轉的兩個元音字符,一個指針從頭向尾遍歷,一個指針從尾到頭遍歷。
java
privatefinalstatic HashSet<Character> vowels =newHashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U'));public String reverseVowels(String s){int i =0, j = s.length()-1;char[] result =newchar[s.length()];while(i <= j){char ci = s.charAt(i);char cj = s.charAt(j);if(!vowels.contains(ci)){result[i++]= ci;}elseif(!vowels.contains(cj)){result[j--]= cj;}else{result[i++]= cj;result[j--]= ci;}}returnnewString(result);}
go
funcreverseVowels(s string)string{b :=[]byte(s)for i, j :=0,len(b)-1; i < j;{ifisVowels(b[i])&&isVowels(b[j]){b[i], b[j]= b[j], b[i]i++j--}elseif!isVowels(b[i])&&isVowels(b[j]){i++}elseifisVowels(b[i])&&!isVowels(b[j]){j--}else{i++j--}}returnstring(b)}funcisVowels(s byte)bool{if s =='a'|| s =='e'|| s =='i'|| s =='o'|| s =='u'|| s =='A'|| s =='E'|| s =='I'|| s =='O'|| s =='U'{returntrue}returnfalse}
4. 回文字符串
題目描述:刪除一個字符,判斷是否能構成回文字符串。
java
publicbooleanvolidPalindrome(String s){for(int i =0, j = s.length()-1; i < j; i++, j--){if(s.charAt(i)!= s.charAt(j)){returnisPalindrome(s, i +1, j)||isPalindrome(s, i, j -1);}}returntrue;}privatebooleanisPalindrome(String s,int i,int j){while(i < j){if(s.charAt(i++)!= s.charAt(j--)){returnfalse;}}returntrue;}
go
funcvalidPalindrome(s string)bool{b :=[]byte(s)for i, j :=0,len(b)-1; i <= j;{if b[i]== b[j]{i++j--}elseif b[i]!= b[j]{returnisPal(b, i+1, j)||isPal(b, i, j-1)}}returntrue}funcisPal(b []byte, i int, j int)bool{for i<=j{if b[i]==b[j]{i++j--}else{returnfalse}}returntrue}
5. 歸并兩個有序數組
題目描述:把歸并結果存放到第一個數組上。
思路:需要從尾到頭遍歷,否則在 num1 上歸并得到的值會覆蓋還未進行歸并比較的值。
java
publicvoidmerge(int[] num1,int m,int[] num2,int n){int index1 = m -1, index2 = n -1;int indexMerge = m + n -1;while(index1 >=0|| index2 >=0){if(index1 <0){num1[indexMerge--]= num2[index2--];}elseif(index2 <0){num1[indexMerge--]= num1[index1--];}elseif(num1[index1]> num2[index2]){num1[indexMerge--]= num1[index1--];}else{num1[indexMerge--]= num2[index2--];}}}
go
funcmerge(nums1 []int, m int, nums2 []int, n int){for i, j, tail := m-1, n-1, m+n-1; i >=0|| j >=0; tail--{var cur intif i ==-1{cur = nums2[j]j--}elseif j ==-1{cur = nums1[i]i--}elseif nums1[i]> nums2[j]{cur = nums1[i]i--}else{cur = nums2[j]j--}nums1[tail]= cur}}