GVKun编程网logo

如果我使用Java 8的String.codePoints来获取一个int codePoints数组,那么数组的长度是否是字符数,这是真的吗?

18

最近很多小伙伴都在问如果我使用Java8的String.codePoints来获取一个intcodePoints数组,那么数组的长度是否是字符数,这是真的吗?这两个问题,那么本篇文章就来给大家详细解答

最近很多小伙伴都在问如果我使用Java 8的String.codePoints来获取一个int codePoints数组,那么数组的长度是否是字符数,这是真的吗?这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展(Java) LeetCode 116. Populating Next Right Pointers in Each Node —— 填充同一层的兄弟节点、2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-、A Deep Learning Model for Estimating Story Points 阅读笔记、C++ code:char pointers and char arrays(字符指针与字符数组)等相关知识,下面开始了哦!

本文目录一览:

如果我使用Java 8的String.codePoints来获取一个int codePoints数组,那么数组的长度是否是字符数,这是真的吗?

如果我使用Java 8的String.codePoints来获取一个int codePoints数组,那么数组的长度是否是字符数,这是真的吗?

给定StringstringJava语言中的,是否可以按照人类认为有意义的实际字符来string.codePoints().toArray().length反映的长度String?换句话说,它可以平滑转义字符和其他编码工件吗?

编辑
通过“人”我有点意思“程序员”我可以想象大多数程序员会看到的\r\n是两个字符,ESC一个字符,等等。但是现在我看到,即使是重音符号得到雾化,所以也没有问题。

答案1

小编典典

没有。

例如:

  • 控制字符(例如ESC,CR,NL等)不会被删除。这些在Unicode中具有不同的代码点。

  • 空格,制表符等的序列未合并

  • 不删除任意连字符(http://www.fileformat.info/info/unicode/char/00AD/index.htm)字符。

  • Unicode组合字符(https://en.wikipedia.org/wiki/Combining_character)未组合。


现在,其中一些是否可能是 “人类会发现有意义的实际角色” 尚有待商but……但总体答案仍然是“否”。


您进行了如下澄清:

我会以为“人类”的意思是“程序员”,我想像大多数程序员会将\ r \ n视为两个字符…

比这更复杂。我是一名程序员,对我而言,这取决于上下文是否\r\n有意义。如果我正在阅读README文件,则我的大脑会将空白中的差异视为没有语义重要性。但是,如果我正在编写解析器,则我的代码将考虑空格…取决于要解析的语言。

(Java) LeetCode 116. Populating Next Right Pointers in Each Node —— 填充同一层的兄弟节点

(Java) LeetCode 116. Populating Next Right Pointers in Each Node —— 填充同一层的兄弟节点

Given a binary tree

struct TreeLinkNode {
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Note:

  • You may only use constant extra space.
  • Recursive approach is fine, implicit stack space does not count as extra space for this problem.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

Example:

Given the following perfect binary tree,

     1
   /  \
  2    3
 / \  / \
4  5  6  7
After calling your function, the tree should look like:

     1 -> NULL
   /  \
  2 -> 3 -> NULL
 / \  / \
4->5->6->7 -> NULL

 

这里递归不算extra space,那么先试试看递归解法。

对于第一层只有root(如果其存在),那么需要看它的左孩子是否存在。如果存在,那么它的next一定等于root的右孩子,不论右孩子存不存在。而对于右孩子,仅仅对于第一层root来说,这一步不用做任何事,只不过如果root右孩子存在,那么此时它已经被连接到root左孩子的next上,而且它本身的next初始为null。这样继续递归调用下一层的节点时候,同样的左孩子如果存在,其next连到右孩子。而这时候要判断此时根节点的next是否为null。如果不为null,相当于此时根节点存在同层的兄弟节点,且这个兄弟节点已经存在当前递归节点的next域中。那么,如果这时根节点的右孩子也存在的话,它是一定等于根节点的兄弟节点的左孩子,不论其左孩子是否为空。之后递归调用每一层根节点的左右孩子即可。看上去很绕,但原理是每一次连上一个根节点的左右孩子,这样下一层时候就知道了兄弟节点是否存在,以便于继续链接根节点及其兄弟节点的孩子。

 

对于迭代,如果不需要常数空间复杂度的话,可以利用队列将每一层的节点存起来,之后逐个处理next域。如果要求常数复杂度,那么就需要在每一层增加一个指针node,从最左边遍历到最右边,逐个将节点连接起来。遍历的方法和递归的想法一样,还是利用上一层next已经连接起来的结果,通过父节点的next域移动到兄弟节点的子节点。

 


解法一,递归(Java)

/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void connect(TreeLinkNode root) {
        if (root == null) return;
        if (root.left != null) root.left.next = root.right;
        if (root.next != null && root.right != null) root.right.next = root.next.left;
        connect(root.left);
        connect(root.right);     
    }
}

 

解法二,迭代,非常数空间(Java)

/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void connect(TreeLinkNode root) {
        if (root == null) return;
        Queue<TreeLinkNode> q = new LinkedList<>();
        q.add(root);
        while (!q.isEmpty()) {
            int size = q.size();
            for (int i = 0; i < size; i++) {
                TreeLinkNode t = q.poll();
                if (i < size - 1)
                    t.next = q.peek();
                if (t.left != null) q.add(t.left);
                if (t.right != null) q.add(t.right);
            } 
        }
    }
}

 

解法三,迭代,常数空间(Java)

/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void connect(TreeLinkNode root) {
        if (root == null) return;
        TreeLinkNode pre = root;
        while (pre.left != null) {
            TreeLinkNode cur = pre;
            while (cur != null) {
                cur.left.next = cur.right;
                if (cur.next != null) cur.right.next = cur.next.left;
                cur = cur.next;
            }
            pre = pre.left;
        }    
    }
}

 

2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-

2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-

2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。力扣149。


福大大 答案2021-09-03:


具体见代码。


代码用golang编写。代码如下:

package main
import "fmt"
func main() { //points := [][]int{{1, 1}, {2, 2}, {3, 3}} points := [][]int{{1, 1}, {3, 2}, {5, 3}, {4, 1}, {2, 3}, {1, 4}} ret := maxPoints(points) fmt.Println(ret)}
// [// [1,3]// [4,9]// [5,7]// ]
func maxPoints(points [][]int) int { if points == nil { return 0 } if len(points) <= 2 { return len(points) } // key = 3 // value = {7 , 10} -> 斜率为3/7的点 有10个 // {5, 15} -> 斜率为3/5的点 有15个 map0 := make(map[int]map[int]int) result := 0 for i := 0; i < len(points); i++ { map0 = make(map[int]map[int]int) samePosition := 1 sameX := 0 sameY := 0 line := 0 for j := i + 1; j < len(points); j++ { // i号点,和j号点,的斜率关系 x := points[j][0] - points[i][0] y := points[j][1] - points[i][1] if x == 0 && y == 0 { samePosition++ } else if x == 0 { sameX++ } else if y == 0 { sameY++ } else { // 普通斜率 gcd0 := gcd(x, y) x /= gcd0 y /= gcd0 // x / y if _, ok := map0[x]; !ok { map0[x] = make(map[int]int) } if _, ok := map0[x][y]; !ok { map0[x][y] = 0 } map0[x][y] = map0[x][y] + 1 line = getMax(line, map0[x][y]) } } result = getMax(result, getMax(getMax(sameX, sameY), line)+samePosition) } return result}
// 保证初始调用的时候,a和b不等于0// O(1)func gcd(a int, b int) int { if b == 0 { return a } else { return gcd(b, a%b) }}
func getMax(a int, b int) int { if a > b { return a } else { return b }}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class25/Code03_MaxPointsOnALine.java)


本文分享自微信公众号 - 福大大架构师每日一题(gh_bbe96e5def84)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

A Deep Learning Model for Estimating Story Points 阅读笔记

A Deep Learning Model for Estimating Story Points 阅读笔记

A Deep Learning Model for Estimating Story Points 阅读笔记

背景与动机

工作量估算是软件项目管理的重要组成部分,特别是对于计划和监视软件项目。 成本和进度超支一直是软件项目中的常见风险。 麦肯锡大学和牛津大学对 5400 个大型 IT 项目进行了研究,发现大型软件项目平均超出预算 66%,加班 33%。 对 1,471 个软件项目的另一项研究 [2] 显示了相似的发现:六个软件项目中有一个预算超支了 200%,进度超支了近 70%。 涉及工作量估算的活动是规划和管理软件项目的关键部分,以确保其在预算范围内及时完成。 不同的涉众可以将工作量估算用作制定项目计划,安排迭代或发布计划,预算和成本计算的输入。 因此,不正确的估计可能会对项目成果产生不利影响

软件工作量估算的研究可以追溯到几十年前,通常可以分为

  • 基于模型的方法
  • 基于专家的方法
  • 结合了基于模型的方法和基于专家的方法的混合方法

基于模型的方法利用来自旧项目的数据来对新项目进行预测。 基于专家的方法依赖于人类的专业知识来做出判断。

因为现有方法的种种不足, 作者提出一个基于故事点的方法, 其中 story 点的值代表着完成此用户故事需要的相对努力例如分配给两个故事点的用户故事应比分配给一个故事点的用户故事花费两倍的精力,基于 LSTM 和 RHN 来建立一个端到端的模型, 能够进行故事点评估

模型结构

其本质就是一个长文本回归问题

模型主要包括 4 个部分

词嵌入

这里的词嵌入和传统的 NLP 问题不同, 它的词向量是自己训练的, 是用 Issue Report(也就是出现问题的代码 issue)为预料进行预训练, 得到词向量库, 然后对每个词进行嵌入。

LSTM 表示文档

使用 LSTM 对所有单词, 把所有单词的词嵌入 输入到 LSTM 中, 然后得到每个单词的输出表示, 然后进行池化,得到文档的最终表示

RHN 进行深度提取

我们在通过 LSTM 之后吗得到每个文档的特征向量,当然我们可以直接进行回归, 但是作者认为这项提取的特征还不够深, 于是使用 RHN 来对文档特征进行更加深入的提取, 之所以使用 RHN, 其主要原因是:

  • 解决参数的数量随层的数量而增长,导致过度拟合;
  • 堆叠许多非线性函数使信息和梯度难以通过 , 模型难以训练

而 RHN 正好可以解决这些问题

回归

在神经网络最后加一个线性层 进行分类, 没有采用传统的回归方法

模型评估

这是数据集的各项数据

在这里插入图片描述

这是最终的实验结果

在这里插入图片描述

可以看出 Deep-SE 的要优于之前的模型

个人评价理解

这篇实证论文非常有意义,我比较有感悟的点为:

  • 其研究方向非常有趣, 是结合着软件工程的敏捷开发来的, 用于去对软件各个故事点进行精力评估
  • 创建一个近现代数据集, 该数据集来自 16 个大型多样的软件项目
  • 提出了一种基于深度学习的,完全端到端的预测系统,用于估计故事点。相较于传统方法,此方法能够使用深度学习方法,可以得到更多的拓展
  • 模型将 LSTM 和 RHN 结合起来, 其中 RHN 也是一个我之前了解不深的网络,

因为其实这篇文章也类似于一个 NLP 方向的任务, 也就是给一个文档,然后预测其分数,我之前有做过一些文档的分类任务,可以给出一些可能的改进方向

  • Attention 现在也是用的比较多的机制了, 可以用于与处理这一些数据
  • Transformer 这样用于处理序列的结构似乎也可以用到
  • 传统的回归方法可以使用一下,效果不一定比 神经网络的 MLP 回归效果差

但总之这篇论文还是给我们一些启示和感悟,关于实证类论文我们也需要多多了解。

C++ code:char pointers and char arrays(字符指针与字符数组)

C++ code:char pointers and char arrays(字符指针与字符数组)

C - 串的正确赋值、复制、修改、比较、连接等方式。

 1 #include<iostream>
 2 #pragma warning(disable: 4996)//这一句是为了解决“strrev”出现的警告
 3 using namespace std;
 4 int main()
 5 {
 6     char* s1 = "Hello ";
 7     char* s2 = "123";
 8     char a[20];
 9     strcpy(a,s1);
10     cout << (strcmp(a, s1) == 0 ? "" : " not") << "equal\n";
11     cout << strcat(a, s2) << endl;
12     cout << strrev(a) << endl;
13     cout << strset(a, ''c'') << endl; 
14     cout << (strstr(s1, "ell") ? "" : "not ") << "found\n";
15     cout << (strchr(s1, ''c'') ? "" : "not ") << "found\n";
16     cin.get();
17     return 0;
18 }

运行结果:

下面进入 string:

string 是一种自定义的类型,它可以方便地执行 C - 串不能直接执行的一切操作。它处理空间占用问题是自动的,需要多少,用多少,不像字符指针那样,提心吊胆于指针脱钩时的空间游离。

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 int main()
 6 {
 7     string a,s1 = "Hello ";
 8     string s2 = "123";
 9     a=s1;//复制
10     cout << (a==s1 ? "" : " not") << "equal\n";//比较
11     cout << a + s2 << endl;//连接
12     reverse(a.begin(), a.end());//倒置串
13     cout << a << endl; 
14     cout << a.replace(0, 9, 9, ''c'') << endl;//设置
15     cout << (s1.find("ell")!=-1 ? "" : "not ") << "found\n";//查找串
16     cout << (s1.find("c") != -1 ? "" : "not ") << "found\n";//查找字符
17     cin.get();
18     return 0;
19 }

运行结果:

 

关于如果我使用Java 8的String.codePoints来获取一个int codePoints数组,那么数组的长度是否是字符数,这是真的吗?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于(Java) LeetCode 116. Populating Next Right Pointers in Each Node —— 填充同一层的兄弟节点、2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-、A Deep Learning Model for Estimating Story Points 阅读笔记、C++ code:char pointers and char arrays(字符指针与字符数组)等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇TreeCellEditor:即使ShouldSelectCell返回false,也必须选择要编辑的单元格(如果只需要返回匹配的列)

下一篇java getRuntime()。exec需要UAC的exe(java:需要)