信息網(wǎng)站建設(shè)預(yù)算windows優(yōu)化大師和360哪個(gè)好
文章目錄
- 前言
- 一、螺旋矩陣||(力扣59)
- 二、螺旋矩陣(力扣54)
- 三、順時(shí)針打印矩陣(劍指 Offer29)
- 四、在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置(力扣34)【二分查找】
- 五、有多少小于當(dāng)前數(shù)字的數(shù)字(力扣1365)
- 六、有效的山脈數(shù)組(力扣941)【雙指針】
- 七、平均等待時(shí)間(力扣1701)
- 八、獨(dú)一無二的出現(xiàn)次數(shù)(力扣1207)
- 每日一題:二進(jìn)制數(shù)轉(zhuǎn)字符串(力扣05.02)
- 每日一題:保證文件名唯一(力扣1487)
前言
1、螺旋矩陣||
2、螺旋矩陣
3、順時(shí)針打印矩陣
4、在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置
5、有多少小于當(dāng)前數(shù)字的數(shù)字
6、有效的山脈數(shù)組
7、平均等待時(shí)間
8、獨(dú)一無二的出現(xiàn)次數(shù)
一、螺旋矩陣||(力扣59)
給定一個(gè)正整數(shù) n,生成一個(gè)包含 1 到 n^2 所有元素,且元素按順時(shí)針順序螺旋排列的正方形矩陣。
注意:循環(huán)次數(shù),以及只有一個(gè)字符時(shí)的情況,或者轉(zhuǎn)完一圈后,剩一個(gè)字符的情況。繞啊繞
class Solution {public int[][] generateMatrix(int n) {int loop = 0;//循環(huán)次數(shù)int[][] res = new int[n][n];int count =1; int start =0;int i,j;while(loop++<n/2){ for(j=start;j<n-loop;j++){res[start][j] = count++;}for(i=start;i<n-loop;i++){res[i][j] = count++;}for(;j>=loop;j--){res[i][j] = count++;}for(;i>=loop;i--){res[i][j] = count++;}start++;}if(n%2==1){ //既包括了一個(gè)字符的情況 也包括了轉(zhuǎn)完一圈后剩一個(gè)字符的情況res[start][start]=count;}return res;}
}
方法二:
該方法可以作為一個(gè)模板
class Solution {public int[][] generateMatrix(int n) {int[][] res = new int[n][n];int left = 0;int right = n-1;int top = 0;int bottom = n-1;int count = 1;res[0][0] =1;while(true){for(int i=left;i<=right;i++){res[top][i] = count++;}if(++top>bottom) break;for(int j=top;j<=bottom; j++){res[j][right] = count++;}if(--right<left) break;for(int i=right;i>=left;i--){res[bottom][i] = count++;}if(--bottom<top) break;for(int j=bottom;j>=top;j--){res[j][left] = count++;}if(++left>right) break;}return res;}
}
二、螺旋矩陣(力扣54)
給你一個(gè) m 行 n 列的矩陣 matrix ,請按照 順時(shí)針螺旋順序 ,返回矩陣中的所有元素。
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();int left = 0;int right = matrix[0].length-1;int top = 0;int bottom = matrix.length-1;while(true){for(int i=left;i<=right;i++){res.add(matrix[top][i]);}if(++top>bottom) break;for(int j=top;j<=bottom;j++){res.add(matrix[j][right]);}if(--right<left) break;for(int i=right;i>=left;i--){res.add(matrix[bottom][i]);}if(--bottom<top) break;for(int j=bottom;j>=top;j--){res.add(matrix[j][left]);}if(++left>right) break;}return res;}
}
三、順時(shí)針打印矩陣(劍指 Offer29)
輸入一個(gè)矩陣,按照從外向里以順時(shí)針的順序依次打印出每一個(gè)數(shù)字。
與上一題的區(qū)別,這道題可以從0開始,也就是一開始的matrix={}
此時(shí)如果
int bottom = matrix.length-1;
int right = matrix[0].length-1;
放在開頭就會(huì)報(bào)錯(cuò)
因此需要加一行:
if(matrix.length==0 ||matrix[0].length==0){return new int[0];}
class Solution {public int[] spiralOrder(int[][] matrix) {int top =0;int left = 0;if(matrix.length==0 ||matrix[0].length==0){return new int[0];}int bottom = matrix.length-1;int right = matrix[0].length-1;int[] res = new int[(bottom+1)*(right+1)];int k = 0;res[0]=1;while(true){for(int i=left;i<=right;i++){res[k++] = matrix[top][i];}if(++top>bottom) break;for(int j=top;j<=bottom;j++){res[k++] = matrix[j][right];}if(--right<left) break;for(int i=right;i>=left;i--){res[k++] = matrix[bottom][i];}if(--bottom<top) break;for(int j=bottom;j>=top;j--){res[k++] = matrix[j][left];}if(++left>right) break;}return res;}
}
四、在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置(力扣34)【二分查找】
給你一個(gè)按照非遞減順序排列的整數(shù)數(shù)組 nums,和一個(gè)目標(biāo)值 target。請你找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。
如果數(shù)組中不存在目標(biāo)值 target,返回 [-1, -1]。
class Solution {public int[] searchRange(int[] nums, int target) {int leftBorder = getLeftBoreder(nums,target);int rightBorder = getRightBoreder(nums,target);if(rightBorder==-2 || leftBorder==-2){return new int[]{-1,-1};}if(rightBorder-leftBorder>1){return new int[]{leftBorder+1,rightBorder-1};}else return new int[]{-1,-1};}public int getLeftBoreder(int[] nums, int target){int left = 0;int right = nums.length-1;int mid;int leftBorder=-2;while(left<=right){mid = (left+right)/2;if(nums[mid]>=target){right=mid-1;leftBorder = right;}else{left = mid +1;}}return leftBorder;}public int getRightBoreder(int[] nums, int target){int left = 0;int right = nums.length-1;int mid;int rightBorder=-2;while(left<=right){mid = (left+right)/2;if(nums[mid]<=target){left=mid+1;rightBorder = left;}else{right = mid -1;}}return rightBorder;}
}
五、有多少小于當(dāng)前數(shù)字的數(shù)字(力扣1365)
給你一個(gè)數(shù)組 nums,對于其中每個(gè)元素 nums[i],請你統(tǒng)計(jì)數(shù)組中比它小的所有數(shù)字的數(shù)目。
換而言之,對于每個(gè) nums[i] 你必須計(jì)算出有效的 j 的數(shù)量,其中 j 滿足 j != i 且 nums[j] < nums[i] 。
以數(shù)組形式返回答案。
找個(gè)桶,這個(gè)桶用來存放每個(gè)數(shù)字出現(xiàn)的次數(shù),然后依次遍歷這個(gè)桶,處理桶中的數(shù)據(jù)
比如 在案例中
bucket[1] =1
bucket[2] =2
bucket[3] =1
bucket[8] =1
遍歷桶的時(shí)候 :
int count =0;for(int i=0;i<barcket.length;i++){int temp = barcket[i];barcket[i] = count;count +=temp;}
最后只取桶中我們需要的數(shù)據(jù)
class Solution {public int[] smallerNumbersThanCurrent(int[] nums) {//桶 存放數(shù)字n出現(xiàn)的次數(shù)int[] barcket = new int[101];for(int i:nums){barcket[i]++;}int[] res = new int[nums.length];int count =0;//處理桶for(int i=0;i<barcket.length;i++){int temp = barcket[i];barcket[i] = count;count +=temp;}int k=0;for(int i:nums){res[k++] = barcket[i];}return res;}
}
六、有效的山脈數(shù)組(力扣941)【雙指針】
給定一個(gè)整數(shù)數(shù)組 arr,如果它是有效的山脈數(shù)組就返回 true,否則返回 false。
如果 arr 滿足下述條件,那么它是一個(gè)山脈數(shù)組:
arr.length >= 3
在 0 < i < arr.length - 1 條件下,存在 i 使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
注意這個(gè)測試用例:
先上山, i=1;i<arr.length && arr[i]>arr[i-1];i++
如果 退出這個(gè)循環(huán)后 i依然等于1 或者i等于 arr.length時(shí) 說明上山上不動(dòng)或者一次爬到終點(diǎn)兩種情況 均return false
此時(shí)i指向最高點(diǎn)的下一位
再下山,;i<arr.length && arr[i-1]>arr[i];i++
如果退出循環(huán)后 i可以等于arr.length 說明下山成功 可以下到山腳
如果;i<arr.length && arr[i]>arr[i+1];i++ 退出循環(huán)后 i如果等于arr.length-1 這樣子
就會(huì)出現(xiàn)測試用例的情況
class Solution {public boolean validMountainArray(int[] arr) {int i ;for(i=1;i<arr.length && arr[i-1]<arr[i];i++);//上山爬不動(dòng)或者一次爬到終點(diǎn)if(i==1 || i==arr.length) return false;for(;i<arr.length-1 && arr[i]>arr[i+1];i++);return i==arr.length-1;}
}
七、平均等待時(shí)間(力扣1701)
有一個(gè)餐廳,只有一位廚師。你有一個(gè)顧客數(shù)組 customers ,其中 customers[i] = [arrivali, timei] :
arrivali 是第 i 位顧客到達(dá)的時(shí)間,到達(dá)時(shí)間按 非遞減 順序排列。
timei 是給第 i 位顧客做菜需要的時(shí)間。
當(dāng)一位顧客到達(dá)時(shí),他將他的訂單給廚師,廚師一旦空閑的時(shí)候就開始做這位顧客的菜。每位顧客會(huì)一直等待到廚師完成他的訂單。廚師同時(shí)只能做一個(gè)人的訂單。廚師會(huì)嚴(yán)格按照 訂單給他的順序 做菜
類似于先來先服務(wù)調(diào)度算法 ,先計(jì)算到達(dá)時(shí)間, 開始時(shí)間不一定等于到達(dá)時(shí)間,可能上一位顧客結(jié)束比較晚,那么開始時(shí)間就應(yīng)該等到上一位顧客結(jié)束之后 start 和arrival應(yīng)該取較大值,然后等待時(shí)間累加即可
class Solution {public double averageWaitingTime(int[][] customers) {int start=0;double wait =0;for(int[] customer:customers){int arrivali = customer[0];start =Math.max(start,arrivali); //一定要取最大值 [5,2],[5,4]start +=customer[1]; //結(jié)束時(shí)間wait += start-arrivali; //等待時(shí)間總和}return wait/customers.length;}
}
八、獨(dú)一無二的出現(xiàn)次數(shù)(力扣1207)
給你一個(gè)整數(shù)數(shù)組 arr,請你幫忙統(tǒng)計(jì)數(shù)組中每個(gè)數(shù)的出現(xiàn)次數(shù)。
如果每個(gè)數(shù)的出現(xiàn)次數(shù)都是獨(dú)一無二的,就返回 true;否則返回 false。
class Solution {public boolean uniqueOccurrences(int[] arr) {HashMap<Integer,Integer> map = new HashMap<>();for(int i:arr){map.put(i,map.getOrDefault(i,0)+1);} //遍歷數(shù)組 看數(shù)組有沒有重復(fù)的值//統(tǒng)計(jì)不同的出現(xiàn)次數(shù)的數(shù)目。如果不同的出現(xiàn)次數(shù)的數(shù)目等于不同數(shù)字的數(shù)目Set<Integer> times = new HashSet<Integer>();for(Map.Entry<Integer,Integer> x:map.entrySet()){times.add(x.getValue());}return times.size() == map.size(); }
}
每日一題:二進(jìn)制數(shù)轉(zhuǎn)字符串(力扣05.02)
二進(jìn)制數(shù)轉(zhuǎn)字符串。給定一個(gè)介于0和1之間的實(shí)數(shù)(如0.72),類型為double,打印它的二進(jìn)制表達(dá)式。如果該數(shù)字無法精確地用32位以內(nèi)的二進(jìn)制表示,則打印“ERROR”。
class Solution {public String printBin(double num) {StringBuilder ans = new StringBuilder();ans.append("0.");while(num>0 && ans.length()<=32){num = num*2.0;if(num>=1){ans.append("1");num=num-1;}else{ans.append("0");}}return ans.length() <= 32 ? ans.toString() : "ERROR";}
}
每日一題:保證文件名唯一(力扣1487)
給你一個(gè)長度為 n 的字符串?dāng)?shù)組 names 。你將會(huì)在文件系統(tǒng)中創(chuàng)建 n 個(gè)文件夾:在第 i 分鐘,新建名為 names[i] 的文件夾。
由于兩個(gè)文件 不能 共享相同的文件名,因此如果新建文件夾使用的文件名已經(jīng)被占用,系統(tǒng)會(huì)以 (k) 的形式為新文件夾的文件名添加后綴,其中 k 是能保證文件名唯一的 最小正整數(shù) 。
返回長度為 n 的字符串?dāng)?shù)組,其中 ans[i] 是創(chuàng)建第 i 個(gè)文件夾時(shí)系統(tǒng)分配給該文件夾的實(shí)際名稱。
創(chuàng)建一個(gè)哈希表,遍歷names數(shù)組,拿到name之后去哈希表中看看有沒有出現(xiàn)過,如果沒有 names數(shù)組不需要做任何操作,哈希表需要記錄一下 此name出現(xiàn)的次數(shù)為1。如果出現(xiàn)過,首先先獲取一下出現(xiàn)了多少次,假設(shè)gta出現(xiàn)了1次,注意:不能直接在出現(xiàn)次數(shù)上+1=2 gta(2),而需要看看names中有沒有這個(gè)次數(shù) 如果有 則次數(shù)需要繼續(xù)++,并且需要修改map中該元素出現(xiàn)的次數(shù)。
class Solution {public String[] getFolderNames(String[] names) {Map<String,Integer> d = new HashMap<>();for(int i=0;i<names.length;i++){if(d.containsKey(names[i])){int k = d.get(names[i]);//獲取出現(xiàn)的次數(shù)while(d.containsKey(names[i] + "(" +k+")")){k++;}//更新值d.put(names[i],k);names[i] += "(" +k+ ")"; }d.put(names[i],1); }return names;}
}