Вопрос об интервью: символы Finding Next и Previous в данной строке?

Я удалил имя для предотвращения затруднения, но это - комментарий, найденный в некотором производственном коде. К сожалению, поскольку это было кодом ASP, относясь к модулю VB6, и клиентка была довольно любознательна, именно она указала на комментарий мне, пока я был локален во время посещения консультирования. К счастью у нее было чувство юмора об этом.

'Я не знаю как справка это "% & работы. Это - загрузка & $ ВЈ! созданный тем подрядчиком---------.
я буду просто оставлять его на месте и надеяться, что никому никогда не нужен он изменение.

К сожалению для меня коду действительно было нужно изменение приблизительно год спустя, при которой точке мы нашли, что не имели никакого исходного кода и должны были выбросить его и перезапись бесплатно.

9
задан raj 31 August 2009 в 19:24
поделиться

8 ответов

Давайте посмотрим ... Вы уже указываете на символ, который может быть однобайтовым или двухбайтовым. В последнем случае вы можете быть на первом или втором байте этого символа. Итак, сначала вам нужно знать, находитесь ли вы в начале персонажа или нет. Что еще хуже, второй байт двухбайтового символа может иметь любое значение, поэтому есть шанс, что все байты больше 127! Из-за этого трудно найти предыдущего персонажа. Но сначала определите, находитесь ли вы в начале нового символа или в середине.

  • Определение начала символа: Вернитесь на один байт назад, пока не найдете байт, у которого не установлен старший бит. (Или начало строки.) Основываясь на количестве байтов с наивысшим установленным битом, вы узнаете, находитесь ли вы в начале или нет. Нечетное количество старших битов, установленных перед текущим байтом, означает, что вам нужно вернуться на один байт для текущего символа.

  • Определение предыдущего символа: вернуться на два байта назад. Если установлен самый высокий бит, вы его нашли. Если нет, перейдите на один байт вперед.

  • Определение следующего символа: Проверить старший бит текущего байта. Если установлено, перейти на два байта вперед. В противном случае только один.

  • Определение количества символов означает, что вы переходите к началу строки и проверяете старший бит каждого байта. Если установлено, добавьте единицу к своему счетчику и пропустите один байт. Если не установлен, просто добавьте один к своему счету. К сожалению, вам придется пройти через всю строку.

Я полагаю, что у вас есть способ указать начало и конец строки. В противном случае нет указания, где он начинается и заканчивается. (Если вы не используете нулевой байт для указания запуска / остановки, и в этом случае вы просто не можете пропустить байты, потому что вы можете пропустить такой нулевой байт.)

Есть ли более быстрый способ? Что ж, если вы знаете местоположение начала / конца, вы можете вычислить количество байтов в этой строке. Количество символов будет количеством байтов в этой строке, у которых не установлены самые высокие биты. Так что считайте только количество байтов меньше 128!

1
ответ дан 4 December 2019 в 10:05
поделиться

Нет, постоянное время невозможно, так как в худшем случае, как утверждает Алексей, почти вся строка состоит из байтов с верхним битом, и вам нужно вернуться к началу, чтобы узнать который является первым байтом с установленным старшим битом в первой двухбайтовой последовательности.

Надеюсь, этот патологический случай встречается редко, и вы можете просто отступать на байт за раз, пока не встретите какой-либо младший байт, и в этом случае вы можете убедитесь, что байт после является началом символа. Затем вы можете снова идти вперед, пока не встретите исходный указатель.

12
ответ дан 4 December 2019 в 10:05
поделиться

Похоже, что в худшем случае нам нужно пройти всю строку. Просто рассмотрите символы A = 100 и B = 200, C = 201 и следующие строки длины N:

S1 = ABCBCBC ... BC

S2 = BBCBCBC ... BC

7
ответ дан 4 December 2019 в 10:05
поделиться

Сканируйте в обратном направлении, пока не дойдете до двух последовательных байтов меньше 127, или пока не дойдете до начала строки. Теперь вы можете подсчитывать символы до того места, где вы находитесь, и до одного после текущего символа.

1
ответ дан 4 December 2019 в 10:05
поделиться

На самом деле вам нужно найти три символа: текущий символ, предыдущий символ и следующий символ.

CurrentChar находится либо в позиции P, указанной указателем, либо в позиции P-1. Если позиция P указывает на байт, который больше 127, тогда P является CurrentChar. Если P меньше 127, посмотрите на P-1. Если P-1 больше 127, то CurrentChar равен P-1, в противном случае CurrentChar находится в позиции P.

Чтобы получить PreviousChar, посмотрите CurrentChar - 2, и если оно больше 127, PreviousChar = CurrentChar -2 в противном случае PreviousChar = CurrentChar -1

NextChar можно получить, посмотрев на P. Если P больше 127, то следующий символ находится в P + 2. Если P меньше 127, NextChar находится в позиции P + 1.

посмотрите на CurrentChar - 2, и если оно больше 127 PreviousChar = CurrentChar -2, в противном случае PreviousChar = CurrentChar -1

NextChar можно получить, посмотрев на P. Если P больше 127, то следующий символ будет на P + 2. Если P меньше 127, NextChar находится в позиции P + 1.

посмотрите на CurrentChar - 2, и если оно больше 127, PreviousChar = CurrentChar -2, иначе PreviousChar = CurrentChar -1

NextChar можно получить, посмотрев на P. Если P больше 127, то следующий символ будет на P + 2. Если P меньше 127, NextChar находится в позиции P + 1.

0
ответ дан 4 December 2019 в 10:05
поделиться

Предыдущая: Сделайте резервную копию 2 байта. Если байт> 127, то это начало символа, в противном случае предыдущий символ начинается со следующего символа.

Далее: Если текущий байт> 127, то следующий символ начинается с 2 байтов, в противном случае следующий символ начинается с 1 байта.

0
ответ дан 4 December 2019 в 10:05
поделиться

при условии, что вы знаете, как двигаться в обратном направлении по строке (и предполагая, что указатель, который они вам дают, фактически гарантированно будет до первого байта текущего символа, если он многобайтовый). Просто переместитесь на два байта назад.

Если текущие данные -2> 127, то предыдущий символ - это последние два байта. если данные в текущем -2 <127, тогда предыдущий символ имеет текущий -1.

Аналогично для следующего символа. Если данные в текущем + 1 <127, то это следующий символ, в противном случае это начало многобайтного символа.

Если вы не можете двигаться назад, то это невозможно сделать, кроме чтения через целую строку, пока не дойдете до текущей позиции.

0
ответ дан 4 December 2019 в 10:05
поделиться

Предполагая, что arr [] похож на строку, а указатель на байт является указателем на INDEX

#include<stdio.h>
#include<stdlib.h>
int find_valid(int);
int arr[]={128,12,128,19,128,127,128,12,32,145,12,223,54,76,23};
int main(){
    int index=1;
    while(index != 0){
    printf("\nEnter the index:");
    scanf("%d",&index);
    if(arr[index] < 128){  // it can be the first byte or the second byte of the Two byte
             if( arr[index -1] < 128 ) printf("\nThis is the first byte in itself"); 
             else // index-1 >= 128
                {
                   int count = find_valid(index-2);
                   if(count%2 == 0) printf("\n This is the second byte of the two bytes:");       
                   else printf("\nThis is the first byte in itself:");
                }
             }
    else{ // it can be the second or the first in the two bytes
           if ( arr[index - 1] < 128 ) printf("\n This is the First byte of the two bytes:");
           else{
                 int count = find_valid(index-2);
                 if(count%2 == 0) printf("\n This is the second byte of the two bytes:");
                 else printf("\nThis is the First byte of the two bytes:");
                }
          }         

    printf("\nHave u seen the result:");
    scanf("%d",&index);}
}

int find_valid(int i){
    int count=0;
    while( (arr[i] > 127) && (i>0) ) { ++count; --i;}
        return count;    
}   
0
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: