검지 offer-java(4)
public class Solution{
String Serialize(TreeNode root){
if(root==null)
return "";
StringBuilder sb=new StringBuilder();
Serialize2(root,sb);
return sb.toString();
}
void Serialize2(TreeNode root,StringBuilder sb){
if(root==null){
sb.append("#,");
return ;
}
sb.append(root.val);
sb.append(',');
Serialize2(root.left,sb);
Serialize2(root.right,sb);
}
int index=-1;
TreeNode Deserialize(String str){
if(str.length()==0)
return null;
String[] strs=str.split(",");
return Deserialize2(strs);
}
TreeNode Deserialize2(String[] strs){
index++;
if(!strs[index].equals("#")){
TreeNode root=new TreeNode(0);
root.val=Integer.parseInt(strs[index]);
root.left=Deserialize2(strs);
root.right=Deserialize2(strs);
return root;
}
return null;
}
}
두 갈래 검색 트리, 그중의 k번째 큰 결점을 찾으세요.예를 들어, 5/\3 7/\/\2 4 6 8에서 세 번째 결점의 값은 결점 수치 크기 순서대로 4입니다.
public class Solution{
int k;
TreeNode KthNode(TreeNode pRoot,int k){
this.k=k;
return helper(pRoot);
}
private TreeNode helper(TreeNode pRoot){
TreeNode temp=null;
if(pRoot!=null){
if((temp=helper(pRoot.left))!=null)return temp;
if(--k==0)return pRoot;
if((temp=helper(pRoot.right))!=null)return temp;
}
return null;
}
}
중위수
import java.util.*;
public class Solution{
ArrayList<Integer> list=new ArrayList<>();
public void Insert(Integer num){
list.add(num);
Collections.sort(list);
}
public Double getMedian(){
int mid=list.size()/2;
if(list.size()%2==0){
Integer a=list.get(mid);
Integer b=list.get(mid-1);
double s=((double)a+(double)b)/2;
return s;
}else
return (double)list.get(mid);
}
}
수조와 슬라이딩 창의 크기를 정해서 모든 슬라이딩 창의 수치의 최대 값을 찾아냅니다.예를 들어 수조 {2,3,4,2,6,2,5,1}과 슬라이딩 창의 크기 3을 입력하면 모두 6개의 슬라이딩 창이 존재하는데 그들의 최대치는 각각 {4,4,6,6,6,5}이다.수조 {2,3,4,2,6,2,5,1}에 대한 슬라이딩 창은 다음과 같은 6개가 있습니다. {[2,3,4], 2,6,2,5,1}, {2,2,3,5,1}, {2,3,4,2,2,5,1}, {2,3,4,2,2,2,2,2,2], 5, 1}, {2,3,4,2,4,2,2,2,2,2,2,2,5], 5,1}, {2,3,4,2,4,2,5,2,5,1}.
import java.util.*;
public class Solution{
public ArrayList<Integer> maxInWindow(int[] num,int size){
ArrayList<Integer> list=new ArrayList<Integer>();
if(num==null||size<=0)
return list;
int len=num.length;
ArrayList<Integer> temp=null;
if(len<size)
return list;
else{
for(int i=0;i<num.length-size+1;i++){
temp=new ArrayList<>();
for(int j=i;j<size+i;j++)
temp.add(num[j]);
Collections.sort(temp);
list.add(temp.get(temp.size()-1));
}
}
return list;
}
}
행렬의 경로는 하나의 행렬에 문자열을 포함하는 모든 문자가 존재하는지 판단하는 함수를 설계하십시오.경로는 행렬의 임의의 칸에서 시작할 수 있으며, 한 걸음 한 걸음 행렬에서 왼쪽, 오른쪽, 위로, 아래로 칸을 이동할 수 있다.만약 한 경로가 행렬의 어떤 칸을 지나갔다면, 이 경로는 이 칸에 다시 들어갈 수 없습니다.예를 들어 a b c e s f c s a d e 행렬에는 문자열'bcced'의 경로가 포함되어 있지만 행렬에는'abcb'경로가 포함되지 않습니다. 문자열의 첫 번째 문자 b가 행렬의 첫 번째 줄, 두 번째 칸을 차지한 후에 경로가 이 칸에 다시 들어갈 수 없기 때문입니다.
public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
if(rows<0||cols<0||str.length==0||matrix.length!=rows*cols||matrix.length==0||str.length>matrix.length)
return false;
int[] mark=new int[matrix.length];
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
if(hasPath(matrix, rows, cols, str, i, j, 0, mark))
return true;
return false;
}
public boolean hasPath(char[] matrix, int rows, int cols, char[] str,int i,int j,int num,int[] mark)
{
int Index=i*cols+j;
if(i<0||i>=rows||j<0||j>=cols||matrix[Index]!=str[num]||mark[Index]==1)
return false;
if(num==str.length-1)
return true;
mark[Index]=1;
if(hasPath(matrix, rows, cols, str, i, j+1, num+1, mark)
||hasPath(matrix, rows, cols, str, i, j-1, num+1, mark)
||hasPath(matrix, rows, cols, str, i+1, j, num+1, mark)
||hasPath(matrix, rows, cols, str, i-1, j, num+1, mark))
return true;
mark[Index]=0;
return false;
}
}
지상에는 m행과 n열의 네모난 칸이 있다.한 로봇이 좌표 0, 0의 칸부터 이동한다. 매번 왼쪽, 오른쪽, 위, 아래 네 방향으로만 한 칸을 이동할 수 있지만 행 좌표와 열 좌표의 수위의 합이 k보다 큰 칸에 들어갈 수 없다.예를 들어 k가 18일 때 로봇은 칸(35,37)에 들어갈 수 있다. 왜냐하면 3+5+3+7=18이기 때문이다.단, 3+5+3+8=19로 칸(35,38)에 들어갈 수 없습니다.실례지만 이 로봇은 몇 개의 칸에 도달할 수 있습니까?
public class Solution {
public int movingCount(int threshold, int rows, int cols)
{
int[][] flag=new int[rows][cols];
return process(0,0,rows,cols, flag, threshold);
}
private int process (int i,int j, int rows ,int cols ,int[][] flag, int threshold){
if(i<0 || i>=rows || j<0 || j>=cols || numSum(i)+numSum(j) > threshold || flag[i][j]==1)
return 0;
flag[i][j]=1;
return process(i-1,j,rows, cols,flag,threshold)+
process(i+1,j,rows,cols,flag,threshold)+
process(i,j+1,rows,cols,flag,threshold)+
process(i,j-1,rows,cols,flag,threshold)+1;
}
private int numSum(int i){
int sum=0;
while(i>0){
int tmp=i%10;
sum+=tmp;
i=i/10;
}
return sum;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.