30. 最小的k個數
31. 連續子陣列的最大和
32. 從1到n整數中1出現的次數
33. 把陣列排成最小的數
題目描述
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
維護乙個計數器,碰到相同的就加一,否則減一,減到0後把當前的值設為從新開始計算的值。最後判斷這個值出現的次數是否是陣列商都的一半
public
intmorethanhalfnum_solution
(int
array)
int time =1;
int res = array[0]
;for
(int i =
1;i < array.length;i++
)else
if(res == array[i]
)else}if
(checkmore
(array, array.length,res)
)return0;
}private
boolean
checkmore
(int
array,
int len,
int result)}if
(num > len /2)
return
false;}
private
boolean
check
(int
array,
int len)
return
true
;}
題目描述
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
用乙個大頂堆來儲存,維護堆的大小為k ,然後開始與堆頂元素比較大小 比堆頂元素小就替換下來
public arraylist
getleastnumbers_solution
(int
input,
int k)
priorityqueue
queue =
newpriorityqueue
(new
comparator
()})
;int i =0;
while
(queue.
size()
< k)
for(
;i < input.length;i++)}
for(integer a : queue)
return res;
}
題目描述
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)
使用動態規劃方式 f[i]代表以i為結尾的最大值
f[i] = max( f[i - 1] + array[i], array[i])
同時維護乙個最大值res
public
intfindgreatestsumofsubarray
(int
array)
int res = integer.min_value;
int cur = array[0]
;for
(int i =
1; i< array.length;i++
)return res;
}
每次判斷前乙個和是否小於零 小於的話就從當前值開始算 不小於的話 就加上當前值 。最後每次判斷一下總和的大小
public
static
intfindgreatestsumofsubarray
(int
array)
int cur =0;
int res = integer.min_value;
for(
int i =
0;i < array.length;i++
)else
if(res < cur)
}return res;
}
題目描述
求出113的整數中1出現的次數,並算出1001300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。
從1到n開始判斷每個數是否帶有數字1,判斷方式就是先把數字%10 == 1 不等的話不管,然後把數字/10 得到除了各位的數字,接著%10 == 1 時間複雜度o(n*logn)
public
intnumberof1between1andn_solution
(int n)
int res =0;
for(
int i =
1;i <= n;i++
)return res;
}private
intget
(int n)
n = n /10;
}return num;
}
題目描述
輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。
自己定義乙個新的比較大小的規則放到list 中 然後把list中的元素依次組合成乙個字串就是最小的數
public string printminnumber
(int
numbers)
arraylist
list =
newarraylist
<
>()
;for
(int a:numbers)
collections.
sort
(list,
newcomparator
()})
; string s ="";
for(
int a:list)
return s;
}
劍指offer 之 時間空間效率的平衡
題目描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。維護三個佇列,選擇三個佇列頭最小的數加入醜數陣列,同時將該最小的數乘以2,3,5放入三個佇列 public in...
劍指offer刷題記錄 時間效率
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。直觀的解法就是借用容器,遍歷整個陣列然後記錄出現次數再加上判斷語句,但這要要耗費大量的空間。試著思考怎麼快速找到乙個陣列 現次數超...
劍指offer 演算法 (時間空間效率的平衡)
題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。解析 根據醜數的定義,醜數應該是另乙個醜數乘以2 3或者5的結果 1除外 因此我們可以建立乙個陣列,裡面的數字是排好...