avatar
1D Mark II shutter count# PhotoGear - 摄影器材
d*i
1
谢谢@wwwyhx大牛贡献的题。看了帖子里面的回复后,有了些思路,虽然对于牛人们,
这道题很简单,对于还是菜鸟的我还是很难的,发个帖子,供大家讨论,希望最
终得出正确的答案吧。
“我面的时候有一简单题一定要O(n), 找树的unival个数(就是这个节点开始所有子树都
一样的节点数) ”
题的意思是,找到这样的子树,满足子树中所有节点的值相等。计算满足此条件的子树
中节点的总个数。(希望没有理解错。)
例子1:
1
结果为 1
例子2:
1
1 1
结果为 3
例子3:
1
2 3
结果为2(2, 3)
例子4:
1
2 3
2
结果为:3 ({2,2}, {3})
例子 5:
1
2 3
2
4
结果为: 2 (4,3);
下面是C++代码,大家指正
---------------更新:不需要看我写的了,直接看楼下的解法吧,哈哈。-----------
----
#include
#include
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
int findUnivalSubtrees(TreeNode *root, int &count)
{
if(root == NULL) return 0;

int left_c = findUnivalSubtrees(root->left, count);
int right_c = findUnivalSubtrees(root->right, count);
if(root->left && root->right && root->left->val == root->val && root->
right->val == root->val)
{
if(left_c * right_c == 0)//subtree have different values
return 0;
++count;
return left_c + right_c + 1;
}
else if(root->left && root->right == NULL &&root->left->val == root->val)
{
if(left_c == 0)//subtree have different values
return 0;
++count;
return left_c + 1;
}
else if( root->right && root->left == NULL && root->right->val == root->
val)
{
if(right_c == 0)//subtree have different values
return 0;
++count;
return right_c + 1;
}else if(root->left == NULL && root->right == NULL)
{
++count;;
return 1;
}
return 0;
}
avatar
s*d
2
请教:有个卖家说他的1D Mark II 不管用raw或jpg都查不了shutter count,这是为什
avatar
w*x
3
代码写成这样就挂了,我记得写的大概只有这得一半
avatar
t*e
4
因为他不想让你知道
avatar
d*i
5

想了想,不知道怎么写的更加简洁,能否给点意见,谢谢了

【在 w****x 的大作中提到】
: 代码写成这样就挂了,我记得写的大概只有这得一半
avatar
s*d
6
我觉得也是,谢谢

【在 t****e 的大作中提到】
: 因为他不想让你知道
avatar
p*2
7

int ans=0;
boolean dfs(Node root)
{
if(root==null)
return true;
boolean l=dfs(root.left);
boolean r=dfs(root.right);
if(l && r && (root.left==null || root.left.val==root.val) && (root.
right==null || root.right.val==root.val))
{
ans++;
return true;
}

return false;
}

【在 d******i 的大作中提到】
:
: 想了想,不知道怎么写的更加简洁,能否给点意见,谢谢了

avatar
l*8
8
那么他的题意描述的对的吧?

【在 w****x 的大作中提到】
: 代码写成这样就挂了,我记得写的大概只有这得一半
avatar
h*n
9
写的太罗嗦了
你可以参考我在那个帖子里的代码

【在 d******i 的大作中提到】
:
: 想了想,不知道怎么写的更加简洁,能否给点意见,谢谢了

avatar
d*i
10

....无地自容了...

【在 p*****2 的大作中提到】
:
: int ans=0;
: boolean dfs(Node root)
: {
: if(root==null)
: return true;
: boolean l=dfs(root.left);
: boolean r=dfs(root.right);
: if(l && r && (root.left==null || root.left.val==root.val) && (root.
: right==null || root.right.val==root.val))

avatar
d*i
11

我这差距也太大了,哈哈,谢谢批评。

【在 w****x 的大作中提到】
: 代码写成这样就挂了,我记得写的大概只有这得一半
avatar
p*2
12

膜拜yhx,这题一遍写对好像也不容易。

【在 d******i 的大作中提到】
:
: 我这差距也太大了,哈哈,谢谢批评。

avatar
l*8
13
刚写了一个,发现跟二爷的很像啊,呵呵。
inline bool diffVar(Node* p, Node* q) { return p&&q && p->var != q->var;};
bool uniVar(Node * root, int & num)
{
if (!root)
return true;
if ( uniVar(root->left, num) && !diffVar(root, root->left)
&& uniVar(root->right,num) && !diffVar(root, root->right)) {
num++;
return true;
}
return false;
}

【在 p*****2 的大作中提到】
:
: 膜拜yhx,这题一遍写对好像也不容易。

avatar
p*2
14

测过吗?

【在 l*********8 的大作中提到】
: 刚写了一个,发现跟二爷的很像啊,呵呵。
: inline bool diffVar(Node* p, Node* q) { return p&&q && p->var != q->var;};
: bool uniVar(Node * root, int & num)
: {
: if (!root)
: return true;
: if ( uniVar(root->left, num) && !diffVar(root, root->left)
: && uniVar(root->right,num) && !diffVar(root, root->right)) {
: num++;
: return true;

avatar
l*8
15
只是目测过。。。。

【在 p*****2 的大作中提到】
:
: 测过吗?

avatar
p*2
16

会不会有bug?

【在 l*********8 的大作中提到】
: 只是目测过。。。。
avatar
l*8
17
恩, 我一开始就写错了。 错误代码如下:
inline bool diffVar(Node * p, Node* q) { return p&&q && p->var != q->var;};
bool uniVar(Node * root, int & num)
{
if (!root)
return true;
if ( !uniVar(root->left, num) || diffVar(root, root->left)
|| !uniVar(root->right,num) || diffVar(root, root->right)) {
return false;
}
num++;
return true;
}

【在 p*****2 的大作中提到】
:
: 会不会有bug?

avatar
l*8
18
你觉得什么地方有问题?

【在 p*****2 的大作中提到】
:
: 会不会有bug?

avatar
p*2
19

uniVar(root->left, num) && !diffVar(root, root->left)
&& uniVar(root->right,num) && !diffVar(root, root->right)
这句,如果uniVar returns false。会不会有问题?

【在 l*********8 的大作中提到】
: 你觉得什么地方有问题?
avatar
l*8
20
说的对! 还是我之前错误代码犯得错误! 在同一个地方摔倒了两次啊。。。

【在 p*****2 的大作中提到】
:
: uniVar(root->left, num) && !diffVar(root, root->left)
: && uniVar(root->right,num) && !diffVar(root, root->right)
: 这句,如果uniVar returns false。会不会有问题?

avatar
l*8
21
呵呵,再改就更和二爷的一样了。 要把递归提出去保证执行。

【在 l*********8 的大作中提到】
: 说的对! 还是我之前错误代码犯得错误! 在同一个地方摔倒了两次啊。。。
avatar
p*2
22

其实我也犯了这个错误了。我测试结果不对,呵呵。所以我说这题一遍能写对真的是大
牛了。

【在 l*********8 的大作中提到】
: 说的对! 还是我之前错误代码犯得错误! 在同一个地方摔倒了两次啊。。。
avatar
g*e
23
也凑个热闹,假设tree nodes的值都是正整数。如果subtree是null认为root(即null
)值是0,非unival sub tree的node是-1.
int count=0;
getUnivalNode(root);
int getUnivalNode(node root)
{
if (root == null)
{
return 0;
}
int left = getUnivalNode(root.left);
int right = getUnivalNode(root.right);
if ((left == 0 || left == root.val)
&& (right == 0 || right == root.val))
{
count++;
return root.val;
}
return -1;
}

【在 p*****2 的大作中提到】
:
: 其实我也犯了这个错误了。我测试结果不对,呵呵。所以我说这题一遍能写对真的是大
: 牛了。

avatar
p*2
24

null
测过吗?

【在 g*****e 的大作中提到】
: 也凑个热闹,假设tree nodes的值都是正整数。如果subtree是null认为root(即null
: )值是0,非unival sub tree的node是-1.
: int count=0;
: getUnivalNode(root);
: int getUnivalNode(node root)
: {
: if (root == null)
: {
: return 0;
: }

avatar
c*a
25
不知道行不行,只测试了几个case
public static int findUni(BSTNode node){
if(node == null) return 0;
if((node.left==null || node.left.data == node.data) &&
(node.right==null ||node.right.data == node.data))
return findUni(node.left) + findUni(node.right) + 1;
else return findUni(node.left) +findUni(node.right);
}
avatar
l*8
26
反例
2
\
2
\
3
答案是0, 你返回1

【在 c*****a 的大作中提到】
: 不知道行不行,只测试了几个case
: public static int findUni(BSTNode node){
: if(node == null) return 0;
: if((node.left==null || node.left.data == node.data) &&
: (node.right==null ||node.right.data == node.data))
: return findUni(node.left) + findUni(node.right) + 1;
: else return findUni(node.left) +findUni(node.right);
: }

avatar
c*a
27

不知道是不是我理解错了。这个树里面,那个3是不是?我看题目里面的例子每个child
都算1个

【在 l*********8 的大作中提到】
: 反例
: 2
: \
: 2
: \
: 3
: 答案是0, 你返回1

avatar
d*i
28

答案是1
From wiki: "A subtree of a tree T is a tree consisting of a node in T and
all of its descendants in T, ... each node is the root node of the subtree
it determines"
叶子节点自身也可为一个subtree,只不过没有descendants。
所以 节点 3 是unival substree

【在 l*********8 的大作中提到】
: 反例
: 2
: \
: 2
: \
: 3
: 答案是0, 你返回1

avatar
l*8
29
不好意思,我说错了。答案应该是1.
你测试这个case的结果是多少?

child

【在 c*****a 的大作中提到】
:
: 不知道是不是我理解错了。这个树里面,那个3是不是?我看题目里面的例子每个child
: 都算1个

avatar
c*a
30
看了上面的code, 我的code应该错了,我的只检查每2个level
2
2 2
2 2
2 2
1 1
应该会出错
avatar
m*0
31
可不可以解释一下,我怎么看不出来问题呢(godlike的code)?谢谢!

【在 p*****2 的大作中提到】
:
: null
: 测过吗?

avatar
g*e
32
板上讨论的几个例子都测了,过了。。。

【在 m**********0 的大作中提到】
: 可不可以解释一下,我怎么看不出来问题呢(godlike的code)?谢谢!
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。