- LeetCode篇
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> m = new HashMap<Integer,Integer>();
int[] res =new int[2];
for(int i=0 ; i < nums.length ; ++i){
m.put(nums[i],i);
}
for(int i=0 ; i < nums.length ; ++i){
int t = target -nums[i];
if(m.containsKey(t) && m.get(t) != i){//m.containsKey(k) 判断是否包含指定的键值
res[0]=i;
res[1]=m.get(t);
break;
}
}
return res;
}
}
要求:
不使用额外的数组空间,必须在原地修改输入数组并使用O(1)额外空间的条件下完成。
思路:
因为数组是有序的,所以只需要用后面的元素覆盖前面重复的数即可。使用快慢指针来记录遍历的坐标。
1)开始时两个指针都指向第一个数;
2)若两个数相同,则快指针向前一步;
3)若两个数不同,则快慢指针都向前一步。
则当快指针走完整个数组后,慢指针当前坐标+1既是数组中不同数字的个数。
class Solution {
public int removeDuplicates(int[] nums) {
int j = 0;//慢指针
int i = 1 ;//快指针
for(; i < nums.length ; i++){
if(nums[i] != nums[j]){
j++;
nums[j]=nums[i];
}
}
return j+1 ;
}
}
要求:
使用空间复杂度为O(1)的原地算法解决问题。
思路:
这个旋转数组的解法有很多中,自己做不出来的情况参考了一下大佬的思路
个人比较喜欢类似字符翻转的方式,嘻嘻嘻嘻嘻哈哈哈哈哈哈 (k->翻转次数)
1) 先把前 n-k 个数字翻转一下;
2)再把后 k 个数字翻转 ;
3)再把整个数组翻转。
在Java中可以使用ArrayList数组,调用Collections.reverse方法实现翻转(小声哔哔 使用Collections.reverse的前提是 数组是ArrayList类型滴)。
(以下,是提交代码)
class Solution {
public void rotate(int[] nums, int k) {
int n=nums.length;
if(nums.length==0 || (k=k%nums.length)==0) return;
reverse(nums,0,n-k-1);
reverse(nums,n-k,nums.length-1);
reverse(nums,0,nums.length-1);
}
public void reverse(int[] nums, int start,int end){ //翻转函数
while(start<end){
int t=nums[start];
nums[start++] = nums[end] ;
nums[end--] = t ;
}
}
}
class Solution {
public int singleNumber(int[] nums) {
int res=0;
for(int i=0;i<nums.length;i++){
res^=nums[i];
}
return res;
}
}
class Solution {
public int[] plusOne(int[] digits) {
int a = digits.length ;
for(int i=a-1;i>=0;i--){
if(digits[i]==9){//末尾数为9 向前进一
digits[i]= 0;
}else{
digits[i]++;//非9 情况
return digits ;
}
}
digits =new int[a+1]; //特殊情况
digits[0] =1;
return digits;
}
}
class Solution {
public void moveZeroes(int[] nums) {
for (int i = 0, j = 0 ; i <nums.length ; i++) {
if(nums[i]!=0){//j每当有一个非0值前移,j++
int t=nums[j];
nums[j++]=nums[i];
nums[i]=t;
}
}
}
}
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
ArrayList<Integer> arr = new ArrayList<>();
for(int num : nums1) set.add(num);
for(int num : nums2){
if(set.contains(num)) {
arr.add(num);
set.remove(num);
}
}
int[] res = new int[arr.size()];
for(int i = 0; i < arr.size(); i++)
res[i] = arr.get(i);
return res;
}
}
class Solution {
public int firstUniqChar(String s) {
int[] len=new int[26];//存储各字符出现次数
for (char c:s.toCharArray())//第一次遍历
len[c-'a']++;
for (int i = 0; i <s.length() ; i++) {//第二次遍历
if(len[s.charAt(i)-'a']==1)
return i;
}
return -1;//无解
}
}
class Solution {
public int minIncrementForUnique(int[] A) {
Arrays.sort(A); //对数组排序
int res = 0 ;
for(int i=1 ; i<A.length ; i++ ){
if( A[i-1]==A[i] ){ //当排序后 如果相连的两个数值相等 则后者则增 (不需要管后者大于前者的情况)
A[i]++;
res++;
}
if( A[i-1] > A[i] ){ //当增加操作使得 相邻元素前者大于后者 则res在两数之差上增加1,小元素在大元素的基础上+1
res = res + A[i-1] - A[i] + 1 ;
A[i] = A[i-1] + 1 ;
}
}
return res ;
}
}
在摸索中前进,希望自己不会后悔!
奥利给!