初级算法题记录(一)
题一:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
思路:不同两数异或为1,相同两数异或为1
代码:
public int singleNumber(int[] nums) { int x = 0; for(int i = 0; i<nums.length;){ x = x ^ nums[i]; i++; } return x; }
题二:存在重复元素
给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
思路1:先将数组排序,再判断有序数组相邻俩数是否相同
代码:
public boolean containsDuplicate(int[] nums) { Arrays.sort(nums); for(int i=0; i<nums.length; ){ if(nums[i]==nums[i+1] ){ return true; } else{ i++; } } return false; }
思路2:尝试使用哈希表
代码:
public boolean containsDuplicate0(int[] nums) { Set<Integer> s = new HashSet<Integer>(); for(int x: nums) { if( !s.add(x)) { return true; } } return false; }
题三:加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
思路:数字为9就需要继续循环;首位为9时要扩充数组空间。
代码:
点击查看代码
public int[] plusOne(int[] digits) {
for(int i = digits.length-1; i>=0;i--){
if(digits[i]<=8){
digits[i]+=1;
return digits;
}
else if(i!=0){
digits[i] = 0;
}
if(i==0 && digits[i]==9){
int[] newDigits = new int[digits.length+1];
newDigits[0] = 1;
newDigits[1] = 0;
for(int k =2; k <= digits.length;){
newDigits[k] = digits[k-1];
k++;
}
return newDigits;
}
}
return digits;
}
题四:删除数组中重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
点击查看代码
public int removeDuplicates(int[] nums) {
if(nums.length==0){
return 0;
}
if(nums.length==1){
return 1;
}
int slow,fast;
for(slow =0,fast=1;fast<=nums.length-1;){
if(nums[slow]==nums[fast]){
fast++;
}
else if(nums[slow] != nums[fast]){
nums[slow+1] = nums[fast];
slow++;
}
}
return slow+1;
}
说明:以上题目均来自力扣习题