Это вопрос, который я сейчас работаю: http://www.geeksforgeeks.org/recursively-remove-adjacent-duplicates-given-string/Неожиданное поведение в C
Вот мой код в Java за один проход:
/*If a character isn't repeating, copy it to str[j].
* Find start and end indices of repeating characters. Recursively call again
* And starting position now should be end+1. Pass j and starting position */
public class removeDuplicates {
public static void main(String[] args)
{
char[] str = {'c','c'};
removeDups(str,0,0,0);
System.out.println(str);
}
public static void removeDups(char[] str,int j, int start,int flag)
{
/*Check if start character is repeating or not. If yes , then loop till you find
* another character. Pass that characters index(new start) into a recursive call*/
if(start == str.length-1)
{
if(flag!=1)
{
str[j] = str[start];
j++;
}
if(j<=str.length-1)
{
str[j] = '0';
}
}
while(start<str.length-1 && str[start]!='0')
{
if(str[start+1]!=str[start])
{
str[j] = str[start];
start++;
j++;
if(start==str.length-1) {removeDups(str,j,start,flag);}
}
else
{
char ref = str[start];
while(str[start]==ref)
{
if(start<str.length-1)
{
start++;
}
else
{
flag =1;
break;
}
}
removeDups(str,j,start,flag);
return;
}
}
}
}
Это работает, как ожидалось. Здесь я просто пытаюсь использовать 0 вместо \ 0 символ как в C. Теперь, когда я перевести код на C
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void removeDups(char *str,int j, int start,int flag)
{
/*Check if start character is repeating or not. If yes , then loop till you find
* another character. Pass that characters index(new start) into a recursive call*/
if(start == strlen(str)-1)
{
if(flag!=1)
{
str[j] = str[start];
j++;
}
if(j<=strlen(str)-1)
{
str[j] = '\0';
}
}
while(start<strlen(str)-1 && str[start]!='0')
{
if(str[start+1]!=str[start])
{
str[j] = str[start];
start++;
j++;
if(start==strlen(str)-1) {removeDups(str,j,start,flag);}
}
else
{
char ref = str[start];
while(str[start]==ref)
{
if(start<strlen(str)-1)
{
start++;
}
else
{
flag =1;
break;
}
}
removeDups(str,j,start,flag);
return;
}
}
}
int main()
{
char str[] = "abcddcba";
int len =
while()
for(int i=0;str[i]!='\0';i++)
{
printf("%c",str[i]);
}
printf("\n");
}
Приведенный выше код дает разные результаты по сравнению с Java code.Its практически идентичны , просто я использую strlen() вместо str.length (как в Java).
Интересная часть: если изменить часть для
if(j<=strlen(str)-1)
{
str[j] = '\0';
return;
}
она прекрасно работает. Я только что добавил оператор return в оператор if.
Почему это происходит? Идентичный код, создающий разные результаты в C и Java
Да, это предполагаемое поведение. – Anant
Вы говорите, что целью Java-кода было изменение длины? В этом случае код Java не работает. 'str.length' не изменяется только потому, что вы установили элемент в' '0''. Однако, как я уже сказал, я недостаточно тщательно изучил ваш код, чтобы понять, что работает и что не работает. – ajb