題目:836. 矩形重疊
題目描述:矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 爲左下角的座標,(x2, y2) 是右上角的座標。
如果相交的面積爲正,則稱兩矩形重疊。需要明確的是,只在角或邊接觸的兩個矩形不構成重疊。
給出兩個矩形,判斷它們是否重疊並返回結果。
示例 1:
輸入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
輸出:true
示例 2:
輸入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
輸出:false
說明:
兩個矩形 rec1 和 rec2 都以含有四個整數的列表的形式給出。
矩形中的所有座標都處於 -10^9 和 10^9 之間。
分析:這種題主要是分析特點,什麼情況下符合要求,利用座標位置,先比較橫座標,在比較縱座標,如果有交叉部分則認爲存在重疊,注意只有一個點一條變得情況不算
代碼:
func isRectangleOverlap(rec1 []int, rec2 []int) bool {
if rec1[0]<=rec2[0] && rec1[2]>rec2[0]{
if rec1[1]<=rec2[1] && rec1[3]>=rec2[1]{
return true
}
if rec2[1]<=rec1[1] && rec2[3]>=rec1[1]{
return true
}
}
if rec2[0]<=rec1[0] && rec2[2]>rec1[0]{
if rec1[1]<=rec2[1] && rec1[3]>=rec2[1]{
return true
}
if rec2[1]<=rec1[1] && rec2[3]>=rec1[1]{
return true
}
}
return false
}
題目:838. 推多米諾
題目描述:
一行中有 N 張多米諾骨牌,我們將每張多米諾骨牌垂直豎立。
在開始時,我們同時把一些多米諾骨牌向左或向右推。
每過一秒,倒向左邊的多米諾骨牌會推動其左側相鄰的多米諾骨牌。
同樣地,倒向右邊的多米諾骨牌也會推動豎立在其右側的相鄰多米諾骨牌。
如果同時有多米諾骨牌落在一張垂直豎立的多米諾骨牌的兩邊,由於受力平衡, 該骨牌仍然保持不變。
就這個問題而言,我們會認爲正在下降的多米諾骨牌不會對其它正在下降或已經下降的多米諾骨牌施加額外的力。
給定表示初始狀態的字符串 “S” 。如果第 i 張多米諾骨牌被推向左邊,則 S[i] = ‘L’;如果第 i 張多米諾骨牌被推向右邊,則 S[i] = ‘R’;如果第 i 張多米諾骨牌沒有被推動,則 S[i] = ‘.’。
返回表示最終狀態的字符串。
示例 1:
輸入:".L.R…LR…L…"
輸出:“LL.RR.LLRRLL…”
示例 2:
輸入:“RR.L”
輸出:“RR.L”
說明:第一張多米諾骨牌沒有給第二張施加額外的力。
提示:
0 <= N <= 10^5
表示多米諾骨牌狀態的字符串只含有 ‘L’,‘R’; 以及 ‘.’;
分析:也沒想出什麼好辦法來,直接暴力的,就三種情況,從左向右遍歷,遇到L,如果前面沒有記錄的標誌位就把前面的都變成L,調整下表位置,如果保留了R,就向中間倒;遇到R,先判斷前面的情況,如果保留了R,就把之前的向右倒,此位置先保留,如果前面沒記錄,也先保留,最後便利到最後,要先判斷一下有沒有保留的R,最後執行一次操作
代碼:
func pushDominoes(dominoes string) string {
n:=len(dominoes)
res:=[]string{}
for i:=0;i<n;i++{
res=append(res,string(dominoes[i]))
}
i:=0
k:=0
flag:=0 //flag=0標識沒有jilu
str :=string("LR")
s1:=string(str[0])
s2:=string(str[1])
for i<n{
if res[i]==s1 || res[i] == s2{
if res[i]==s1 && flag==0{
for j:=k;j<i;j++{
res[j]=res[i]
}
k=i+1
}else if res[i]==s1 && flag==1{
if (k+i)%2==0{
for j:=k;j<(k+i)/2;j++{
res[j]=res[k]
}
for j:=(k+i)/2+1;j<i;j++{
res[j]=res[i]
}
}else{
for j:=k;j<=(k+i)/2;j++{
res[j]=res[k]
}
for j:=(k+i)/2+1;j<i;j++{
res[j]=res[i]
}
}
k=i+1
flag=0
}else if res[i]==s2 && flag==0{
flag=1 //flag=1 保留R的標誌
k=i
}else if res[i]==s2 && flag==1{
for j:=k;j<i;j++{
res[j]=res[k]
}
k=i
}
}
i++
}
if k<i && flag==1{
for j:=k;j<n;j++{
res[j]=res[k]
}
}
return strings.Join(res,"")
}
題目:有效的括號
題目描述:
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true
分析:一看就是考察棧的操作,進行匹配,然後我又利用go中的strings庫,寫了一下,替換,知道不能替換爲止
注意,不管是哪種方法,最後一定要檢查一下棧中的存留還有沒有,就是會出現“((”,這種情況
代碼1:
func isValid(s string) bool {
n:=len(s)
if n%2!=0{
return false
}
res:=[]byte{}
str:=string("([{}])")
s1:=str[0]
s2:=str[1]
s3:=str[2]
s4:=str[3]
s5:=str[4]
s6:=str[5]
for i:=0;i<n;i++{
if s[i]==s1 || s[i]==s2 || s[i]==s3{
res=append(res,s[i])
}else{
if len(res)==0{
return false
}
if s[i]==s4 && res[len(res)-1]==s3{
res=res[:len(res)-1]
}else if s[i]==s4 && res[len(res)-1]!=s3{
return false
}
if s[i]==s5 && res[len(res)-1]==s2{
res=res[:len(res)-1]
}else if s[i]==s5 && res[len(res)-1]!=s2{
return false
}
if s[i]==s6 && res[len(res)-1]==s1{
res=res[:len(res)-1]
}else if s[i]==s6 && res[len(res)-1]!=s1{
return false
}
}
}
if len(res)!=0{
return false
}
return true
}
代碼2:
func isValid(s string) bool {
n:=len(s)
if n%2!=0{
return false
}
for strings.Contains(s,"()") || strings.Contains(s,"{}") ||strings.Contains(s,"[]"){
s=strings.Replace(s,"()","",-1)
s=strings.Replace(s,"{}","",-1)
s=strings.Replace(s,"[]","",-1)
}
if s==""{
return true
}
return false
}