LeetCode刷題第一天
今天刷了4道 LeetCode題,分別是:
- 1-bit and 2-bit Characters :
We have two special characters. The first character can be represented by one bit
0
. The second character can be represented by two bits (10
or11
).Now given a string represented by several bits. Return whether the last character must be a one-bit character or not. The given string will always end with a zero.
- Add Strings :bigInteger
- Array Partition I : Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible.
- Backspace String Compare :Given two strings
S
T
, return if they are equal when both are typed into empty text editors.#
means a backspace character.
對於第一題 1-bit and 2-bit Characters,難點在於需要仔細的分析問題的關鍵(思考過程需要從最後向前算,而且著重點在於找規律,如果找不出規律可以先舉例子再歸納; 思考過程也可以從頭向後看,需要分析的是,只要有1一定是2bit;)。
Solution1:從尾到頭開始分析。需要注意的是不會存在01的組合,因此和末尾的0相鄰的1出現的奇偶次數格外重要。
class Solution { public boolean isOneBitCharacter(int[] bits) { int length=bits.length; int count=0; if(bits[length-1]!=0){ return false; }else{ for(int i=length-2;i>=0 && bits[i]==1;i--){ count++; } } if(count % 2 == 0){ return true; }else{ return false; } } }
Solution2:從頭到尾分析,可以發現從頭起第一個0肯定是1bit,因為不會有01組合,那麼接下來出現的1肯定是2bit。那麼有一個方法就是設定一個指標來從頭開始,遇到0就向前走1步,遇到1就向前走2步。如果最後一個0是1bit,那麼指標會恰好停在0的index,如果最後一個0是2bit,那麼指標會大於最後一個0的index,即index+1;
class Solution {
//這種方法很巧妙,需要在程式設計中學習並思考這種方法,pointer
public boolean isOneBitCharacter(int[] bits) {
int pointer=0;
while(pointer<bits.length-1){
pointer+=bits[pointer]+1;
}
return pointer==(bits.length-1);
}
}
對於第二題,Add Strings,大數加法;
Tip:如果直接輸出str.charAt(),可以正常輸出char字元,而不是ASCII碼;如果和字串相接,也是可以正常輸出char字元,而不是ASCII;只有一種情況,但是如果把str.charAt()即char型別當成int進行計算,那麼它將自動使用對應的ASCII來進行計算;比如'0'的ASCII為48;
Solution1:常規思維,先把兩個陣列倒序,長度短的後面補0。然後按index把每一位相加,結果保留,有進位的話在下一位相加時多加1,最後把這些字串連起來就是結果。
Solution2: 思維方法和上面相似,程式碼上可以更加精簡。不需要倒序,直接使用for迴圈倒著遍歷,並且合併兩個for迴圈到一個for迴圈上。最後有一點注意的是,每一位相加的結果 result%10 就是需要儲存的,result / 10就是代表是否需要進位的。
class Solution {
public String addStrings(String num1, String num2) {
int overFlow=0;
StringBuffer res= new StringBuffer();
for(int i=num1.length()-1,j=num2.length()-1;i>=0 || j>=0 || overFlow==1; i--,j--){
int wei1= i<0 ? 0: num1.charAt(i)-'0';
int wei2= j<0 ? 0: num2.charAt(j)-'0';
int append= (wei1 + wei2 + overFlow) % 10;
res.append(append);
overFlow= (wei1 + wei2 + overFlow) / 10;
}
return res.reverse().toString();
}
}
對於第三題,Array Partition I,實際上就是排序演算法,先把陣列排序後,取奇數index所對應的值的和就是最終結果。
我使用了快排。
class Solution {
public int arrayPairSum(int[] nums) {
quickSort(nums);
int sum=0;
for(int i=0;i<nums.length;i+=2){
sum+=nums[i];
}
return sum;
}
public static void quickSort(int[] arr){
qsort(arr, 0, arr.length-1);
}
private static void qsort(int[] arr, int low, int high){
if (low < high){
int pivot=partition(arr, low, high); //將陣列分為兩部分
qsort(arr, low, pivot-1); //遞迴排序左子陣列
qsort(arr, pivot+1, high); //遞迴排序右子陣列
}
}
private static int partition(int[] arr, int low, int high){
int pivot = arr[low]; //樞軸記錄
while (low<high){
while (low<high && arr[high]>=pivot) --high;
arr[low]=arr[high]; //交換比樞軸小的記錄到左端
while (low<high && arr[low]<=pivot) ++low;
arr[high] = arr[low]; //交換比樞軸小的記錄到右端
}
//掃描完成,樞軸到位
arr[low] = pivot;
//返回的是樞軸的位置
return low;
}
}
對於第四題,Backspace String Compare , 自己的想法是可以用棧的結構來做,但是結果執行速度不夠理想。然後使用了暴力法,發現速度比棧的做法快。
List<Character> 是char型別的List,List中的型別都必須是包裝類,不能為原始型別如char,int;
如果用原始型別會報錯:Syntax error, insert "Dimensions" to complete ReferenceType;
class Solution {
public boolean backspaceCompare(String S, String T) {
StringBuffer str1= new StringBuffer();
StringBuffer str2= new StringBuffer();
List<Character> results1=new ArrayList<Character>();
List<Character> results2=new ArrayList<Character>();
for(int i=0;i<S.length();i++){
if(S.charAt(i) == '#'){
pop(results1);
}else{
push(S.charAt(i),results1);
}
}
for(int i=0;i<T.length();i++){
if(T.charAt(i) == '#'){
pop(results2);
}else{
push(T.charAt(i),results2);
}
}
for(char c:results1){
str1.append(c);
}
for(char c:results2){
str2.append(c);
}
return str1.toString().equals(str2.toString());
}
public void push(char c,List results){
results.add(c);
}
public void pop(List results){
if(results.size()==0)
return;
results.remove(results.size()-1);
}
}
方法2
class Solution {
public boolean backspaceCompare(String S, String T) {
int maxLength= S.length()>T.length() ? S.length() : T.length();
StringBuffer str1=new StringBuffer();
StringBuffer str2=new StringBuffer();
for(int i=0;i<maxLength;i++){
if(i<S.length()){
if(S.charAt(i)=='#'){
if(str1.length()!=0){
str1.deleteCharAt(str1.length()-1);
}
}else{
str1.append(S.charAt(i));
}
}
if(i<T.length()){
if(T.charAt(i)=='#'){
if(str2.length()!=0){
str2.deleteCharAt(str2.length()-1);
}
}else{
str2.append(T.charAt(i));
}
}
}
return str1.toString().equals(str2.toString());
}
}
相關推薦
LeetCode刷題第一天
今天刷了4道 LeetCode題,分別是: 1-bit and 2-bit Characters : We have two special characters. The first character can be represented by one bit 0.
LeetCode算法題--刷題第一天
ive strong targe 方案 imp string color not ces Given an array of integers, return indices of the two numbers such that they add up to a spe
綜合刷題第一天
1.線性表若採用鏈式儲存結構時,要求記憶體中可用儲存單元的地址?(連續不連續都可以) 解析:鏈式儲存結構和順序儲存結構相比較,最大的優點是,地址不連續,操作靈活 但是一般Malloc和new是不連續的。 2.某二叉樹的前序遍歷序列與中序遍歷序列相同,均為 ABCDEF ,則按層次輸出(同一層
LeetCode刷題——第一題 (兩數之和)
1.兩數之和 題目描述 思路 程式碼實現 可能出現的問題 題目描述 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。 你可以假設每種輸入只會對應一
刷題第一天各種蒙圈
今天刷了兩道簡單題,全是string,隨即就各種蒙圈…… 總結一下今天遇到的知識點吧,恐怕是沒有時間全部認真寫了。 1、神奇的vector操作 push_back、size(不同於陣列的sizeof,關於sizeof的大小到底是什麼大小,還要再考證一下) 2、string和vector也算是差不多的東
leetcode刷題(第一天)
1.two sum: 解法一: function sum(arr,target){ var len = arr.length; for(var i=0;i<len;i++){ for(v
LeetCode刷題記錄(第一天)
Jewels and Stones原題目:You're given strings J representing the types of stones that are jewels, and S representing the stones you have. Eac
C#LeetCode刷題之#278-第一個錯誤的版本(First Bad Version)
問題 你是產品經理,目前正在帶領一個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。 假設你有 n 個版本 [1, 2, ..., n],你想找出導致之後所有版本出錯的第一個錯誤的版本。 你可
LeetCode刷題之路(第二天)
5.最長迴文子串 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 這個演算
LeetCode刷題之路(第三天)
10. 正則表示式匹配 給定一個字串 (s) 和一個字元模式 §。實現支援 ‘.’ 和 ‘*’ 的正則表示式匹配。 ‘.’ 匹配任意單個字元。 ‘*’ 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。 說明: s 可能為空,且只包含
LeetCode刷題之387Python字串中的第一個唯一字元
題目: 給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. 注意事項:您可以假定該字串只包含小寫字母。 我的解答: 先計數,
LeetCode刷題記錄——第387題(字串中的第一個唯一字元)
題目描述 給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。 案例: s = “leetcode” 返回 0. s = “loveleetcode”, 返回 2. 思路分析 關鍵問題在於,如何找到第一個不重複字元
第一次leetcode刷題
lincode的測試不需要自己進行輸入輸出,可以直接編寫函式等待測試 #關於python的函式,self 還不懂 類中定義函式,必須要有self作第一引數 python的for迴圈不需要i為整數,可以直接迴圈變數 迭代邏輯。。 函式邏輯:def,return 有if的情況下,可以分開多次
LeetCode刷題——字串中的第一個唯一字元
大家好,結束了五一假期,繼續刷題日記。本次題目要求如下:我的思路是這樣的:首先計算出s的長度並將s複製給一個字串cont,進入while迴圈,知道字串s為空,使用.find()函式尋找字串裡是否有與s[0]相同的字元若有,使用remove函式把所有與s[0]相同的字元包括s[
LeetCode刷題之第一題——TwoSum
Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices
LeetCode刷題之第一題——Add Two Numbers
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes cont
LeetCode刷題記錄(第五天)
Trapping Rain Water原題目:Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much wate
LeetCode刷題記錄(第六天)
Swap Salary這道題竟然是一個sql題,雖然經常寫sql和看關於mysql的效能優化,但是我發現一個大問題,我都白學來。。。。題目:Given a table salary, such as the one below, that has m=male and f=f
leetcode刷題第三天<無重復字符的最長子串>
子串 由於 break 垃圾 lee pre tco wke 第三天 給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。 示例 2:
#leetcode刷題之路41-缺失的第一個正數
ostream == return pac ssi n) continue etc mes 給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。示例 1:輸入: [1,2,0]輸出: 3示例 2:輸入: [3,4,-1,1]輸出: 2示例 3:輸入: [7,8,9,1