天天看點

LeetCode 67二進制求和&68文本左右對齊&69x的平方根

原創公衆号:​

​bigsai​

​ 專注于Java、資料結構與算法,一起進大廠不迷路!

關注後回複進群即可加入力扣打卡群,歡迎劃水。近期打卡:

LeetCode 55跳躍遊戲&56合并區間&57插入區間跟我打卡

LeetCode 58最後一個單詞長度&59螺旋矩陣Ⅱ&60排列序列跟我打卡

LeetCode 61旋轉連結清單&62不同路徑&63不同路徑 II打卡

LeetCode 65有效數字&66加一 &67二進制求和

二進制求和

給你兩個二進制字元串,傳回它們的和(用二進制表示)。

輸入為 非空 字元串且隻包含數字 1 和 0。

示例 1:

輸入: a = “11”, b = “1”

輸出: “100”

示例 2:

輸入: a = “1010”, b = “1011”

輸出: “10101”

提示:

每個字元串僅由字元 ‘0’ 或 ‘1’ 組成。

1 <= a.length, b.length <= 10^4

字元串如果不是 “0” ,就都不含前導零。

分析:

思路也很簡單,如果不等長找到短的,從右往左周遊疊加進位。然後再處理常得尾周遊地方,具體實作上。先通過交換是的ab字元串其中一個較小,可以用StringBuilder去實作數字疊加。

實作代碼:

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder stringBuilder=new StringBuilder();
        if(a.length()<b.length())
        {
            String team=a;
            a=b;
            b=team;
        }
        char ach[]=a.toCharArray();
        char bch[]=b.toCharArray();
        int alen=a.length(),blen=b.length();
        int minLen=b.length();
        int jinwei=0;//進位
        for(int i=0;i<minLen;i++)
        {
            char ch1=ach[alen-1-i];
            char ch2=bch[blen-1-i];
            int va=(ch1-'0')+(ch2-'0')+jinwei;
            jinwei=va/2;
            va=va%2;
            stringBuilder.insert(0,va);
        }
        
        for(int i=0;i<alen-minLen;i++)
        {
            char ch1=ach[alen-1-minLen-i];
            int va=ch1-'0'+jinwei;
            jinwei=va/2;
            va=va%2;
            stringBuilder.insert(0,va);
        }
        if(jinwei==1)
            stringBuilder.insert(0,1);
        return stringBuilder.toString();
    }
}      
LeetCode 67二進制求和&amp;68文本左右對齊&amp;69x的平方根

文本左右對齊

描述

給定一個單詞數組和一個長度 maxWidth,重新排版單詞,使其成為每行恰好有 maxWidth 個字元,且左右兩端對齊的文本。

你應該使用“貪心算法”來放置給定的單詞;也就是說,盡可能多地往每行中放置單詞。必要時可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 個字元。

要求盡可能均勻配置設定單詞間的空格數量。如果某一行單詞間的空格不能均勻配置設定,則左側放置的空格數要多于右側的空格數。

文本的最後一行應為左對齊,且單詞之間不插入額外的空格。

說明:

單詞是指由非空格字元組成的字元序列。

每個單詞的長度大于 0,小于等于 maxWidth。

輸入單詞數組 words 至少包含一個單詞。

示例:

輸入:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
輸出:
[
   "This    is    an",
   "example  of text",
   "justification.  "
]
示例 2:

輸入:
words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16
輸出:
[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]
解釋: 注意最後一行的格式應為 "shall be    " 而不是 "shall     be",
     因為最後一行應為左對齊,而不是左右兩端對齊。       
     第二行同樣為左對齊,這是因為這行隻包含一個單詞。
示例 3:

輸入:
words = ["Science","is","what","we","understand","well","enough","to","explain",
         "to","a","computer.","Art","is","everything","else","we","do"]
maxWidth = 20
輸出:
[
  "Science  is  what we",
  "understand      well",
  "enough to explain to",
  "a  computer.  Art is",
  "everything  else  we",
  "do                  "
]      

分析

字元串處理的貪心題,首先要知道以下幾點要求:

  • 如果不是一個單詞,不是最後一行,每一行最左側和最右側都有單詞。
  • 每一行盡量長,能夠包容夠多的單詞,但每兩個單詞之間至少有一個空格
  • 空格要勻稱,如果無法絕對相等那麼偏左的要多一點
LeetCode 67二進制求和&amp;68文本左右對齊&amp;69x的平方根

在具體處理上也很容易,可以用一個數字統計目前List已存字元長度。如果可以存下就加進來,存不下那就處理目前集合然後初始話添加進來。在處理目前集合的時候需要注意空格情況,首先空格要均勻,其次如果不能絕對均勻左側要比右側多。

實作代碼為:

public static List<String> fullJustify(String[] words, int maxWidth) {
        List<String>vaList=new ArrayList<String>();
        List<String>teamList=new ArrayList<String>();
        int strlen=0;
        for(int i=0;i<words.length;i++)
        {
            String str=words[i];
            //System.out.println(teamlen+teamList.toString());
            if(strlen+str.length()+teamList.size()<=maxWidth)
            {
                teamList.add(str);
            }
            else {
                String team=addstr(teamList,words,maxWidth,strlen,false);
                vaList.add(team);
                teamList.clear();
                teamList.add(str);
                strlen=0;
            }
            strlen+=str.length();
        }
        String team=addstr(teamList,words,maxWidth,strlen,true);
        vaList.add(team);
        return vaList;

    }

    private static  String addstr(List<String> teamList,String words[], int maxWidth,int strlen,boolean isLast) {//組合成一個字元串傳回
        //System.out.println(teamList.toString());
        StringBuilder sb=new StringBuilder();
        if(isLast)
        {
            for(String str:teamList)
            {
                sb.append(str);
                sb.append(' ');
            }
            if(sb.length()>maxWidth)
            {
                return sb.deleteCharAt(maxWidth).toString();
            }
            for(int i=sb.length();i<maxWidth;i++)
            {
                sb.append(' ');
            }
        }
        else {
            //計算空格總數量
            int spaceNum=maxWidth-strlen;
               int aveNum;
               if(teamList.size()==1)
               aveNum=1;
            else  aveNum=spaceNum/(teamList.size()-1);
               
            int more=spaceNum-aveNum*(teamList.size()-1);//不能平均分 多出來的空格

            sb.append(teamList.get(0));
            for(int i=1;i<teamList.size();i++)
            {
                int spaceAdd=aveNum;
                if(more-->0)
                    spaceAdd++;

                for(int j=0;j<spaceAdd;j++)
                    {sb.append(' ');}
                sb.append(teamList.get(i));
            }
               for(int i=sb.length();i<maxWidth;i++)
            {
                sb.append(' ');
            }
        }
        return sb.toString();
    }      

x的平方根實作 int sqrt(int x) 函數。

計算并傳回 x 的平方根,其中 x 是非負整數。

由于傳回類型是整數,結果隻保留整數的部分,小數部分将被舍去。

示例 1:

輸入: 4

輸出: 2

示例 2:

輸入: 8

輸出: 2

說明: 8 的平方根是 2.82842…,

由于傳回類型是整數,小數部分将被舍去。

分析

本題有三個方法求解分别為:

  • 暴力求解(不推薦)
  • 二分查找(推薦)
  • 牛頓疊代法

對于本題,筆者就實作一個二分查找找到這個數字,而牛頓疊代法有空可以自行學習(也不是很難原理可以找專門文章看一看)。

public int mySqrt(int x) {
   //二分
   int l=0,r=x/2+1;
   while (l<r) {
    long mid=(l+r)/2;
    if(mid*mid<=x)
    {
       if((mid+1)*(mid+1)<=x)
       {
          l=(int) (mid+1);
       }
       else {
         return (int) mid;
      }
    }
    else {
      r=(int) mid;
   }
}
   return l; 
}      

爬樓梯

LeetCode 67二進制求和&amp;68文本左右對齊&amp;69x的平方根

分析:

入門dp,狀态轉移方程為:初始指派好後,​

​dp[i]=dp[i-1]+dp[i-2];​

public int climbStairs(int n) {
     if(n<3)return n;
   int dp[]=new int[n+1];
   dp[1]=1;
   dp[2]=2;
   for(int i=3;i<n+1;i++)
   {
     dp[i]=dp[i-1]+dp[i-2];
   }
   return dp[n];
 }      

結語

原創不易,bigsai請你幫兩件事幫忙一下:

  1. star支援一下, 您的肯定是我在平台創作的源源動力。
  2. 微信搜尋「bigsai」,關注我的公衆号,不僅免費送你電子書