1.只出現一次的數字
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
class Solution {
public int singleNumber(int[] nums) {
int [] values = new int[nums.length];
int index = 0;
for( int i = 0; i < nums.length; i++ ){
int flag = checkExist(values,nums[i]);
if( flag != -1){
//將傳來的下標的值置空
values[flag] = 0;
}else{
// 保存未出現的值
values[index++] = nums[i];
}
}
for(int i = 0; i<values.length; i++){
// 如果值不爲0直接輸出
if(values[i] != 0){
return values[i];
}
}
return 0;
}
//如果存在該值則返回存儲的下標
public int checkExist(int []nums, int value){
for(int i = 0; i<nums.length; i++){
if(nums[i] == value){
return i;
}
}
return -1;
}
}
2.多數元素
給定一個大小爲 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設數組是非空的,並且給定的數組總是存在多數元素。
示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
class Solution {
public int majorityElement(int[] nums) {
int num = nums.length;
//[0]保存值 [1]保存出現的次數
int[][] values = new int[num][2];
for( int i=0; i<num; i++){
// 判斷是否存在
int index = checkGetIndex(values,nums[i]);
// 如果存在直接 讓 出現的次數+1
if( index != -1){
values[index][1] += 1;
}else{
// 否則保存該值
values[i][0] = nums[i];
}
}
for( int i=0; i<num; i++){
if(values[i][1] >= num/2){
return values[i][0];
}
}
return 0;
}
public int checkGetIndex(int[][] values,int value){
for(int i = 0; i<values.length; i++){
if(value == values[i][0]){
return i;
}
}
return -1;
}
}
合併兩個有序數組
給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 num1 成爲一個有序數組。
說明:
初始化 nums1 和 nums2 的元素數量分別爲 m 和 n 。
你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。
示例:
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int result = m;
for(int i = 0; i < n; i++){
int curr = nums2[i];
for(int j = 0; j <= result; j++ ){
// 如果當前數組1的值大於數組2的,則插入進去
if( nums1[j] >= curr ){
// 插入下標即爲j。
add(nums1,j,curr,result);
break;
}
//數組1遍歷完了循環還沒跳出去(即數組2沒被加進去)說明當前數組2的值比數組1的任何一個數還要大,直接加到末尾就行。
if( j == result){
add(nums1,result,curr,result);
}
}
// 考慮到增加 了i個數組2的值,所以 數組1的有效位增大,所以是 m+i。
result += 1;
}
}
/*
nums爲 num1
index爲要插入的下標
value爲要插入的值
m爲當前i的有效值
*/
public void add(int[] nums,int index,int value,int m){
for(int i = m; i > index ; i--){
nums[i] = nums[i-1];
}
nums[index] = value;
}
}