Algorithm 使用<;=2个字符

Algorithm 使用<;=2个字符,algorithm,string,Algorithm,String,假设给您一个输入字符串: "my name is vikas" 建议算法将其修改为: "name vikas" 这意味着删除长度的单词,迭代字符串的各个字符,保持字符串中的当前位置和“当前单词”,累积长度>=k的所有当前单词,从累积的单词中重新组合字符串 此算法使用就地重写并最小化元素之间的副本数: final int k = 2; char[] test = " my name is el jenso ".toCharArray(); i

假设给您一个输入字符串:

"my name is vikas"
建议算法将其修改为:

"name vikas"

这意味着删除长度
的单词,迭代字符串的各个字符,保持字符串中的当前位置和“当前单词”,累积长度>=k的所有当前单词,从累积的单词中重新组合字符串

此算法使用就地重写并最小化元素之间的副本数:

    final int k = 2;

    char[] test = "     my name     is el   jenso    ".toCharArray();
    int l = test.length;
    int pos = 0;
    int cwPos = 0;
    int copyPos = 0;

    while (pos < l)
    {
        if (Character.isWhitespace(test[pos]))
        {
            int r = pos - cwPos;
            if (r - 1 < k)
            {
                copyPos -= r;
                cwPos = ++pos;
            }
            else
            {
                cwPos = ++pos;
                test[copyPos++] = ' ';
            }
        }   
        else
        {
            test[copyPos++] = test[pos++];
        }
    }

    System.out.println(new String(test, 0, copyPos));
final int k=2;
char[]test=“我的名字是el jenso”。toCharArray();
int l=测试长度;
int pos=0;
int-cwPos=0;
int-copyPos=0;
while(pos
迭代字符串的各个字符,保持字符串中的当前位置和“当前单词”,累积长度>=k的所有当前单词,从累积单词重新组合字符串

此算法使用就地重写并最小化元素之间的副本数:

    final int k = 2;

    char[] test = "     my name     is el   jenso    ".toCharArray();
    int l = test.length;
    int pos = 0;
    int cwPos = 0;
    int copyPos = 0;

    while (pos < l)
    {
        if (Character.isWhitespace(test[pos]))
        {
            int r = pos - cwPos;
            if (r - 1 < k)
            {
                copyPos -= r;
                cwPos = ++pos;
            }
            else
            {
                cwPos = ++pos;
                test[copyPos++] = ' ';
            }
        }   
        else
        {
            test[copyPos++] = test[pos++];
        }
    }

    System.out.println(new String(test, 0, copyPos));
final int k=2;
char[]test=“我的名字是el jenso”。toCharArray();
int l=测试长度;
int pos=0;
int-cwPos=0;
int-copyPos=0;
while(pos
类似的东西就足够了(我想时间复杂度是最佳的):


空间复杂性呢?好的,这可以用O(k)(当然,我们不能计算输入和输出的大小),如果你仔细想想的话。它不会出现在.NET中,因为Split生成实际的数组。但是您可以构建迭代器。如果你想象字符串只是字符的迭代器,它将成为O(1)算法。

类似的东西就足够了(我想时间复杂度是最优的):

空间复杂性呢?好的,这可以用O(k)(当然,我们不能计算输入和输出的大小),如果你仔细想想的话。它不会出现在.NET中,因为Split生成实际的数组。但是您可以构建迭代器。如果你想象字符串只是字符的迭代器,它将变成O(1)算法。

split()
by
“”
并省略
if length()
split()
by
“”
并省略
if length()
(斯卡拉)


(Scala)

我认为您可以在
O(n)
时间内完成此操作。迭代字符串,保留一个指向正在处理的单词开头的指针。如果发现单词的长度大于
k
,则用该单词覆盖字符串的开头。这是一个C代码(它假设每个单词之间用空格分隔):

void修改(字符*s,整数k){
int n=strlen(s);
int j=0,cnt=0,r=0,prev=-1;
s[n++]='';//设置为避免特殊情况
for(int i=0;i k){
如果(r>0)s[r++]='';
而(j
我想你可以在
O(n)
时间内完成这项工作。迭代字符串,保留一个指向正在处理的单词开头的指针。如果发现单词的长度大于
k
,则用该单词覆盖字符串的开头。这是一个C代码(它假设每个单词之间用空格分隔):

void修改(字符*s,整数k){
int n=strlen(s);
int j=0,cnt=0,r=0,prev=-1;
s[n++]='';//设置为避免特殊情况
for(int i=0;i k){
如果(r>0)s[r++]='';
而(j
最佳答案取决于语言。这还不够不懂语言。@Colin@marcog:谢谢,这真的不是一个家庭作业问题。当我注意到,有时当你在某个论坛上提出问题时,他们会修剪字符串,使其成为地址栏中的链接,于是出于好奇,我开始思考方法,并因此提出问题。最好的答案取决于语言。这还不够不懂语言。@Colin@marcog:谢谢,这真的不是一个家庭作业问题。当我注意到,有时当你在某个论坛上提出问题时,他们会修剪字符串,使其成为地址栏中的链接,于是出于好奇,我开始考虑该方法,并由此提出问题。@eljenso:这似乎是O(n)空间方法。建议我一些没有额外空格的东西。这个词的定义在这里很关键。那
,一个
?如果你遇到一个长度 "a short sentence of words" split ' ' filter {_.length > 2} mkString " "
void modify(char *s, int k){

    int n = strlen(s);
    int j = 0, cnt = 0, r = 0, prev = -1;
    s[n++] = ' ';  // Setinel to avoid special case
    for(int i=0; i<n; i++){
        if(s[i] == ' '){
            if (cnt > k){
                if(r > 0) s[r++] = ' ';
                while(j < i) s[r++] = s[j++];
            }       
            cnt = 0;
        }
        else {
            if (prev == ' ') j = i;
            cnt++;
        }
        prev = s[i];
    }
    s[r] = '\0';
}
int main(){

    char s[] = "my name is vikas";
    modify(s, 2);
    printf("%s\n", s);
}