ARTES #013
ARTES #013
ARTS é uma atividade iniciada por
由左耳朵耗子--陈皓: Faça pelo menos uma pergunta sobre o algoritmo leetcode toda semana, leia e comente pelo menos um artigo técnico em inglês, aprenda pelo menos uma habilidade técnica e compartilhe um artigo com opiniões e pensamentos. (Ou seja, Algoritmo, Revisão, Dica e Compartilhamento são chamados de ARTS) e persistem por pelo menos um ano.
ARTES 013
Este é o artigo 13
Pergunta sobre algoritmo de algoritmo
479. Maior Produto Palíndromo
Dificuldade: Fácil
Encontre o maior palíndromo feito do produto de dois números de n dígitos.
Como o resultado pode ser muito grande, você deve retornar o maior palíndromo mod 1337.
Exemplo:
Entrada: 2
Saída: 987
Explicação: 99 x 91 = 9009, 9009% 1337 = 987
Nota:
O intervalo de n é [1,8].
Solução
Idioma: C
O rótulo desta pergunta é fácil, o que é mais difícil para mim do que as perguntas difíceis que fiz antes. Depois que vi o rótulo fácil pela primeira vez, não prestei muita atenção nele, então apenas usei a pesquisa de força bruta para fazer isso, percorrer todas as combinações de números, encontrar o produto e então julgar se é um número palíndromo. O resultado é um tempo limite. Eu testei e demorou vários minutos para ser executado quando n = 5.
int largestPalindrome(int n) {
if (n==1) {
return 9;
}
long int left = 0;
for (long int i = 0; i < n; i++) {
left = left*10 + 9;
}
long int right = left;
long int low = pow(10,n-1);
int maxpalindrome = 0;
for (; left >0; left--) {
right=left;
for (; right >0; right--) {
int count = left * right;
int count1=count;
int palindrome = 0;
for (; count >0; ) {
palindrome = palindrome *10 + count%10;
count = count/10;
}
if (palindrome == count1) {
if (palindrome > maxpalindrome) {
maxpalindrome =palindrome;
}
}
}
}
return maxpalindrome%1337;;
Só posso mudar de ideia. Primeiro encontro o número de palíndromos e depois os divido para ver se atendem aos requisitos. O resultado ainda expira. Imprimi e descobri que existem muitos palíndromos.
int largestPalindrome(int n) {
if (n==1) {
return 9;
}
long int left = 0;
for (long int i = 0; i < n; i++) {
left = left*10 + 9;
}
long int right = left;
long int low = pow(10,n-1);
for (long int i = left * right; i>0; i--) {
long int count = i;
long int count1=count;
long int palindrome = 0;
for (; count >0; ) {
//找回文数 1234 4321
palindrome = palindrome *10 + count%10;
count = count/10;
if (count<palindrome) {
break;
}
if (count == palindrome) {
if (count > right) {
break;
}
for (long int j = left; j>count1/right; j--) {
if (count1%j ==0 ) {
return count1 % 1337;
}
}
}
}
}
return 0;
}
No final, ainda não consegui encontrar uma resposta que não expirasse. As respostas abaixo são de outras pessoas. Use-os para aprender com:
long int creatPalindrome(long int num,int n){
long int p=num*pow(10,n);
for(int i=0;i<n;i++){
p=p+(num/(long int)pow(10,n-i-1))*(long int)pow(10,i);
num=num%(long int)pow(10,n-i-1);
}
return p;
}
int largestPalindrome(int n) {
if(n==1){return 9;}
long int p=pow(10,n)-1;
long int q=p;
long int temp=pow(10,n-1);
long int ret=0;
long int ret1=0;
while(p>=temp){
ret=creatPalindrome(p,n);
for(int i=q;i>=temp;i--){
ret1=ret/i;
if(ret1>=i){break;}
if(ret1>=temp&&ret%i==0)
{
return ret%1337;
}
}
p--;
}
return NULL;
}
Revisão
1.Este artigo vem de https://medium.freecodecamp.org/how-i-launched-an-ios-app-with-a-teenager-926b5a65a991 Este artigo fala principalmente sobre como ensinar um adolescente a implementar um APP iOS relacionado à natação.
https://medium.freecodecamp.org/how-i-launched-an-ios-app-with-a-teenager-926b5a65a991
Como lancei um aplicativo iOS com um adolescente
Como passar do Scratch para um aplicativo para iPhone na App Store Como obter um aplicativo para iPhone do zero na App Store
Seguindo dois de meus artigos anteriores, (Como ensinar programação para adolescentes e Guia para iniciantes em Raspberry Pi), quero compartilhar minhas experiências ajudando um adolescente a passar da codificação no Scratch para a construção e implantação de um aplicativo iOS. Seguindo meus dois artigos anteriores, (Como ensinar programação para adolescentes e Guia para iniciantes em Raspberry Pi), gostaria de compartilhar minha experiência ajudando um adolescente a passar da codificação do zero até a construção e implantação de um aplicativo iOS.
Conforme mencionei em um de meus artigos anteriores, percebi que os adolescentes têm um forte desejo de fazer algo que pareça mais real. Então, a pergunta natural que surgiu repetidamente em muitas das minhas aulas foi “Podemos construir um aplicativo para iPhone?”. Achei que era o momento certo para os alunos criarem um aplicativo e pedi a cada um que apresentasse uma ideia. Conforme mencionei em um dos meus artigos anteriores, percebi que os adolescentes têm um forte desejo de fazer coisas que pareçam mais autênticas. Portanto, uma pergunta natural que surge repetidamente em muitas das minhas aulas é “Podemos desenvolver um aplicativo para iPhone?” Sinto que agora é a hora dos alunos desenvolverem aplicativos e peço a cada um que tenha uma ideia.
Uma semana depois, um dos alunos voltou com uma ideia e parecia realmente muito interessante, então decidimos reservar um tempo fora do horário normal de aula e construí-la juntos. E acabamos com um aplicativo legal chamado SwimGrader. Uma semana depois, um dos alunos voltou com uma ideia que parecia muito interessante, então decidimos passar algum tempo fora do horário normal de aula e fazer isso juntos. Acabamos desenvolvendo um aplicativo legal chamado Swim Grader.
Como surgiu o SwimGrader? Sobre o que é o SwimGrader?
Meu aluno é um nadador ávido e sempre teve curiosidade em saber como é bom nadar. Avaliar sua própria habilidade de natação não é tão óbvio, e muitas vezes você precisa de algum especialista para lhe dizer o quão bom você é. Meu aluno adora nadar e está sempre curioso para saber como são boas suas habilidades na natação. Avaliar sua própria habilidade de natação nem sempre é óbvio, e muitas vezes você precisa de algum especialista para lhe dizer o quão bom você é.
Todos sabemos que reduzir o tempo de volta é o objetivo que a maioria dos atletas almeja, por isso muitas pessoas tentam fazer isso. No entanto, é muito difícil saber em detalhes no que você deve trabalhar para conseguir tempos de volta mais baixos. Claro, você pode apenas tentar chutar mais rápido e praticar mais para ganhar mais músculos de natação, mas essa geralmente não é a melhor maneira de melhorar sua natação. Todos sabemos que diminuir os tempos das voltas é o objetivo da maioria dos atletas, por isso muitos tentam fazê-lo. No entanto, é muito difícil saber o que é preciso fazer para conseguir tempos de volta mais baixos. Claro, você pode tentar chutes mais rápidos e mais exercícios para ganhar mais músculos na natação, mas essa geralmente não é a melhor maneira de melhorar sua natação.
A partir disso, meu aluno pensou que as pessoas precisavam de algo que pudesse identificar uma área de natação na qual deveriam trabalhar em seguida. Então, sua ideia brilhante foi criar um aplicativo que pudesse avaliar vários aspectos da sua natação e dizer qual área você deveria trabalhar para melhorar. A partir deste ponto, meus alunos decidiram que as pessoas precisavam de algo para identificar quais áreas da natação deveriam estudar em seguida. Então, sua ideia brilhante foi criar um aplicativo que avaliasse todos os aspectos da sua natação e informasse quais áreas você deveria melhorar.
Sabendo por experiência própria como é difícil melhorar minha natação, fiquei realmente impressionado com a ideia dele. Não era nada que eu tivesse ouvido falar antes e tinha um caso de uso específico que poderia beneficiar muitas pessoas. No entanto, como meu aluno nunca havia criado um aplicativo para iPhone antes, decidimos trabalhar juntos nele do zero. Sabendo por experiência própria como era difícil melhorar minha natação, fiquei impressionado com suas ideias. Nunca ouvi falar disso antes e tem um caso de uso específico que pode beneficiar muitas pessoas. No entanto, como meus alunos nunca haviam desenvolvido um aplicativo para iPhone antes, decidimos começar do zero juntos.
Primeiros passos
Não sendo um nadador competitivo e também pensando que seria um bom exercício de reflexão, pedi ao meu aluno que criasse o design do aplicativo e as métricas que poderíamos usar para avaliar o nadador no aplicativo. Não sendo um nadador competitivo e pensando que seria um bom exercício de reflexão, pedi aos meus alunos que criassem designs para o aplicativo e métricas que pudéssemos usar para pontuar os nadadores dentro do aplicativo.Esse processo acabou sendo uma experiência de aprendizado muito boa. Este exercício não apenas ajudou o aluno a resolver os detalhes do projeto, mas também manteve as minhas expectativas e as do meu aluno alinhadas. Conforme mencionado em meus artigos sobre ensino de adolescentes, os adolescentes têm grandes expectativas em relação a fazer qualquer coisa com programação. Então, depois de conversar sobre cada detalhe de quais dados coletar, quais páginas criar, como funciona cada transição de página e quais métricas mostrar, nós dois deveríamos definir claramente nossos objetivos e expectativas. O processo acabou sendo um ótimo aprendizado. Este exercício não só ajudou os alunos a elaborar os detalhes do projeto, mas também me permitiu alinhar com as expectativas dos alunos. Como mencionei em meu artigo sobre ensino de adolescentes, os adolescentes têm grandes expectativas em relação à programação. Assim, depois de discutir detalhadamente quais dados coletar, quais páginas criar, como funcionaria cada conversão de página e quais métricas mostrar, todos tivemos nossos objetivos e expectativas claros.
E saber exatamente o produto final que planejávamos fazer ajudou o aluno a permanecer constantemente engajado. Saber o produto final exato que planejamos produzir ajuda os alunos a permanecerem engajados.
Divagando um pouco do tema principal, muitas vezes aprendemos coisas que não sabemos quando iremos aplicar em nossas vidas. Isso pode nos fazer sentir como se estivéssemos caminhando por um longo túnel escuro sem luz no final. Muitas vezes aprendemos coisas que não sabemos quando aplicaremos em nossas vidas. Isso pode nos fazer sentir como se estivéssemos caminhando por um longo túnel escuro sem luz no final.
Isso é especialmente verdadeiro quando você é mais jovem, pois provavelmente lhe dizem para aprender certas coisas. Acredito que isso faz com que muitos alunos não fiquem entusiasmados com o que aprendem. Aprendi que definir as expectativas certas ao mostrar o final da jornada de um exercício de aprendizagem realmente ajuda a motivar os alunos e aumenta a eficiência do próprio exercício de aprendizagem. Isto é especialmente verdadeiro quando você é jovem, pois provavelmente lhe dizem para aprender certas coisas. Acho que isso faz com que muitos alunos não estejam interessados no que estão aprendendo. Aprendi que definir as expectativas certas, mostrando onde o processo de aprendizagem terminará, é realmente útil para motivar os alunos e tornar o próprio processo de aprendizagem mais eficiente.
Então, voltando ao design e às métricas do aplicativo que o aluno sugeriu: meu aluno primeiro sugeriu que o aplicativo, em geral, não deveria adicionar nenhuma sobrecarga para o nadador. Ele queria construir um aplicativo que fosse capaz de coletar estatísticas sem prejudicar o desempenho do nadador. Então, voltando ao design e às métricas dos aplicativos sugeridos pelos alunos: meus alunos primeiro sugeriram aplicativos que, em geral, não deveriam sobrecarregar os nadadores. Ele queria desenvolver um aplicativo que coletasse estatísticas sem afetar o desempenho do nadador.
O aluno já tinha em mente um dispositivo de medição para atender exatamente a esse propósito, que compartilharei na próxima seção. Depois de alguma discussão para chegar a um produto minimamente viável, decidimos que deveríamos nos concentrar na coleta de duas métricas específicas: golpes de cabeça e velocidade de giro. O aluno já tinha em mente um aparelho de medição para esse fim, que compartilharei com vocês na próxima seção. Após alguma discussão, chegamos a um produto mínimo viável e decidimos que deveríamos nos concentrar na coleta de duas métricas específicas: BOP de cabeça e velocidade de giro.
Como os golpes de cabeça são um movimento principalmente estranho que pode reduzir a eficiência da natação, se pudermos simplesmente contar o número de golpes de cabeça dentro de algum intervalo de tempo, pensamos que poderíamos sugerir uma redução nos movimentos estranhos da cabeça. Como a batida na cabeça é um movimento estranho que pode reduzir a eficiência da natação, se pudéssemos simplesmente contar o número de batidas na cabeça durante um período de tempo, pensamos que poderíamos recomendar a redução do movimento estranho da cabeça.
Também concordamos que curvas rápidas são necessárias para reduzir os tempos de volta. Portanto, se pudéssemos medir o tempo que o nadador leva para fazer uma curva no final da raia, poderíamos avaliar o nadador com base no tempo. Também concordamos que curvas rápidas são necessárias para melhorar os tempos de volta. Portanto, se pudermos medir quanto tempo leva para um nadador virar no final da raia, podemos pontuar o nadador com base nesse tempo.
Dado este design e a ideia, só precisávamos começar a implementá-lo com o sensor certo. Com este design e ideia em mente, só precisamos começar a implementá-lo com os sensores certos.
Então, qual hardware tornou o SwimGrader possível? Então, qual hardware tornou o SwimGrader possível?
Embora os iPhones mais recentes sejam à prova d’água, os nadadores provavelmente não querem arriscar levar seus iPhones supercaros para a piscina. Então, meu aluno sugeriu que usássemos um sensor da mbientlab e o colocássemos em uma caixa à prova d’água. Embora os iPhones mais recentes sejam à prova d’água, os nadadores podem não querer arriscar levar um iPhone super caro para a piscina. Então, meus alunos sugeriram que usássemos um sensor da mbientlab e o encapsulassemos em uma caixa à prova d’água.
Este sensor permite coletar diversos dados do ambiente e de seus movimentos, pois abriga um acelerômetro, um giroscópio, um barômetro, um termômetro e assim por diante. Além disso, eles têm alguns códigos de exemplo que você pode usar para inicializar seu aplicativo, para que possa coletar imediatamente os dados de interesse. Este sensor permite coletar diversos dados do ambiente e de seus movimentos, pois contém um acelerômetro, um giroscópio, um barômetro, um termômetro e muito mais. Além disso, eles têm alguns códigos de exemplo que você pode usar para inicializar seu aplicativo e coletar imediatamente os dados de interesse.Então, a nossa ideia foi colocar o sensor dentro da touca dele. Ele sentiu que isso teria um impacto mínimo na capacidade de nadar dos nadadores, com o que concordei. Compramos imediatamente dois desses sensores e começamos a construir nosso aplicativo. Não vou entrar em detalhes sobre a construção de um aplicativo iOS simples de várias páginas usando Swift, porque eles foram abordados em milhares de outros artigos (aqui está um bom artigo médio que apresenta muitos deles). Então, a ideia foi colocar o sensor dentro da touca de natação. Ele acha que isso terá um impacto mínimo na habilidade de nadar do nadador, e eu concordo. Adquirimos imediatamente dois desses sensores e começamos a construir nosso aplicativo. Não entrarei em detalhes sobre a construção de um aplicativo iOS simples de várias páginas usando Swift, pois eles foram abordados em milhares de outros artigos (aqui está um bom artigo médio entre muitos).
Janela do aplicativo SwimGrader
Apresentando o SwimGrader
Então, depois de horas de programação e de passar pela Apple para aprovar nosso aplicativo para a App Store, finalmente conseguimos lançar o SwimGrader. Foi realmente surpreendente ver isso, pois ajudei apenas na configuração inicial do projeto, que consistia em montar um projeto Swift de aplicativo de página única e ajudar na adição de botões e campos de texto, além de integração simples de hardware para recuperar dados do sensor. Então, depois de horas de programação e com a aprovação de nosso aplicativo pela App Store por meio da Apple, finalmente estávamos prontos para lançar o Swim Grader. Foi realmente surpreendente ver isso, já que ajudei apenas na configuração inicial do projeto, que incluiu a configuração de um projeto Swift de aplicativo de página única, ajudando a adicionar botões e campos de texto e integração simples de hardware para recuperar dados de sensores.
Para dar uma ideia de como foi fácil a integração do hardware, aqui está um trecho de código para fazer o LED do sensor piscar em verde. A recuperação de dados foi igualmente simples, como pode ser visto no exemplo abaixo. Para ilustrar como é fácil a integração de hardware, aqui está um trecho de código que faz o LED do sensor parecer verde. A recuperação de dados é muito simples, conforme mostrado no exemplo abaixo.
import MetaWear
import MetaWearCpp
MetaWearScanner.shared.startScan(allowDuplicates: true) { (dev) in
// We found a MetaWear board, see if it is close by
if dev.rssi.intValue > -50 {
// We found a MetaWear board!
MetaWearScanner.shared.stopScan()
// Connect to the board we found
dev.connectAndSetup().continueWith { t in
if let error = t.error {
// Sorry we couldn't connect
print(error)
} else {
// We are connected! Flash its LED!
var pattern = MblMwLedPattern()
mbl_mw_led_load_preset_pattern(
&pattern, MBL_MW_LED_PRESET_PULSE)
mbl_mw_led_stop_and_clear(device.board)
mbl_mw_led_write_pattern(
device.board, &pattern, MBL_MW_LED_COLOR_GREEN)
mbl_mw_led_play(device.board)
}
}
}
}
Com apenas uma ajuda limitada, meu aluno foi muito além de minhas expectativas ao construir um algoritmo de avaliação e uma interface gráfica. Ele recuperou os dados X, Y, Z do sensor e deu uma nota de quanto a cabeça se movia em cada direção. Ele pesquisou online uma biblioteca gráfica no iOS e exibiu o que seu sensor relatou. E, depois de terminar seu aplicativo, ele foi em frente e testou seu aplicativo na piscina! Com ajuda limitada, meus alunos foram muito além das minhas expectativas e construíram um algoritmo de pontuação e uma interface gráfica. Ele pega dados X, Y, Z do sensor e fornece o grau de movimento da cabeça em cada direção. Ele pesquisa na web bibliotecas gráficas no iOS e exibe o que os sensores relatam. Depois de concluir a inscrição, ele continuou testando sua aplicação no pool!
É um esforço de um estudante do ensino médio, então não vai parecer sofisticado como Clash of Clans. No entanto, acho que é realmente impressionante, vindo de um jovem estudante que nunca construiu um aplicativo para iPhone antes! Depois de terminar isso, o aluno me perguntou: É um esforço do ensino médio, então não parece tão sofisticado quanto Clash of Clans. No entanto, achei isso realmente impressionante, vindo de um jovem estudante que nunca havia desenvolvido um aplicativo para iPhone! Depois de fazer isso, o aluno me perguntou:
Podemos construir um aplicativo Apple Watch para isso? Podemos construir um aplicativo Apple Watch para isso?
Eu disse a ele que ele definitivamente poderia construir uma versão do aplicativo para Apple Watch no futuro, mas que provavelmente poderia construí-lo sem minha ajuda :). Eu disse a ele que ele definitivamente poderia desenvolver uma versão do aplicativo para Apple Watch no futuro, mas ele provavelmente não precisaria da minha ajuda para fazer isso :).
Considerações Finais
Como adultos, acho que é muito difícil manter as nossas ideias frescas, selvagens e atualizadas. Então, acho que é realmente educativo ouvir o que esses jovens estudantes têm a dizer e apoiar o que eles querem fazer de todas as maneiras que pudermos. Como adultos, acho que é muito difícil manter a mente fresca, selvagem e relevante. Então, acho muito educativo ouvir esses jovens estudantes e apoiar o que eles querem fazer.
Essas oportunidades não apenas abrem as portas para a construção de produtos novos e interessantes, mas também apoiam os alunos para apresentar e construir suas próprias ideias, proporcionando-lhes as melhores experiências educacionais. Ver meu aluno pedindo para as pessoas baixarem seu aplicativo me faz sorrir. Espero poder criar um aplicativo legal algum dia e mostrá-lo aos meus amigos. Embora meu aluno tenha me vencido nisso :) Essas oportunidades não apenas abrem as portas para o desenvolvimento de produtos novos e interessantes, mas também apoiam os alunos no marketing e na construção de suas próprias ideias para proporcionar-lhes a melhor experiência educacional possível. Me faz rir ver meu aluno fazer com que as pessoas baixem seu aplicativo. Espero um dia poder desenvolver um aplicativo legal e mostrá-lo aos meus amigos. Embora meus alunos tenham me vencido :)
Por outro lado, aprendi que criar um aplicativo iOS interessante é mais fácil do que nunca. Existem muitos artigos que ajudam você a criar aplicativos para todas as finalidades possíveis: jogos, aplicativos de visualização única, aplicativos de redes sociais e muito mais. Além disso, há mais hardware do que nunca que você pode conectar facilmente ao seu telefone e ampliar os recursos do seu telefone. A propósito, aprendi que criar um aplicativo iOS bacana está mais fácil do que nunca. Existem muitos artigos para ajudá-lo a desenvolver aplicativos para todos os fins possíveis: jogos, aplicativos de visualização única, aplicativos de redes sociais e muito mais. Além disso, agora há mais hardware que você pode conectar facilmente ao seu telefone e ampliar a funcionalidade do seu telefone.
Espero poder em breve compartilhar experiências de construção de meu próprio aplicativo. Só estou preocupado se meus alunos acharão meu aplicativo legal… Espero poder compartilhar minha experiência no desenvolvimento de aplicativos em breve. Só estou preocupado se meus alunos acharão meu aplicativo legal…Obrigado por ler este artigo! Espero poder convencê-lo a trabalhar com seus alunos ou filhos e começar a construir um aplicativo simples! Também estou aberto para ouvir sobre suas ideias interessantes de aplicativos. Obrigado por ler este artigo! Espero poder convencê-lo a trabalhar com seus alunos ou filhos e começar a construir um aplicativo simples! Também adoraria ouvir suas ideias para aplicativos interessantes.
- Esta semana traduzi a parte não traduzida do primeiro capítulo na semana passada. O primeiro capítulo foi traduzido: https://dandan2009.github.io/2018/10/26/Instruments-chinese-translation/
DICAS
Esta semana encontrei um problema com NSCharacterSet, então estudei este NSCharacterSet e descobri que a função NSCharacterSet é bastante poderosa. ###NSCharacterSet Um objeto que representa um conjunto fixo de valores de caracteres Unicode para uso em operações de pesquisa. Um objeto que representa um conjunto fixo de valores de caracteres Unicode usados para operações de pesquisa.
Visão geral
Um objeto NSCharacterSet representa um conjunto de caracteres compatíveis com Unicode. Os objetos NSString e NSScanner usam objetos NSCharacterSet para agrupar caracteres para operações de pesquisa, para que possam encontrar qualquer conjunto específico de caracteres durante uma pesquisa. As duas classes públicas do cluster, NSCharacterSet e NSMutableCharacterSet, declaram a interface programática para conjuntos de caracteres estáticos e dinâmicos, respectivamente. O objeto NSCharacterSet representa um conjunto de caracteres compatível com Unicode (compatível). Os objetos NSString e NSScanner usam objetos NSCharacterSet para agrupar caracteres para operações de pesquisa para que possam encontrar um conjunto específico de caracteres durante o processo de pesquisa. As duas classes públicas do cluster, NSCharacterSet e NSMutableCharacterSet, declaram interfaces de programação para conjuntos de caracteres estáticos e dinâmicos, respectivamente.
Os objetos que você cria usando essas classes são chamados de objetos de conjunto de caracteres (e quando não houver confusão, apenas como conjuntos de caracteres). Devido à natureza dos clusters de classes, os objetos do conjunto de caracteres não são instâncias reais das classes NSCharacterSet ou NSMutableCharacterSet, mas de uma de suas subclasses privadas. Embora a classe de um objeto de conjunto de caracteres seja privada, sua interface é pública, conforme declarado por essas superclasses abstratas, NSCharacterSet e NSMutableCharacterSet. classes adotam os protocolos NSCopying e NSMutableCopying, tornando conveniente converter um conjunto de caracteres de um tipo para outro. Os objetos criados usando essas classes são chamados de objetos de conjunto de caracteres (somente conjuntos de caracteres quando isso não for confuso). Devido à natureza do agrupamento de classes, o objeto do conjunto de caracteres não é uma instância real da classe NSCharacterSet ou NSMutableCharacterSet, mas uma instância de uma de suas subclasses privadas. Embora a classe do objeto do conjunto de caracteres seja privada, sua interface é pública, declarada pelas superclasses abstratas NSCharacterSet e NSMutableCharacterSet. A classe de conjunto de caracteres adota os protocolos NSCopying e NSMutableCopying, tornando conveniente converter um tipo de conjunto de caracteres em outro tipo de conjunto de caracteres.
A classe NSCharacterSet declara a interface programática para um objeto que gerencia um conjunto de caracteres Unicode (consulte a especificação de cluster da classe NSString para obter informações sobre Unicode). O principal método primitivo do NSCharacterSet, characterIsMember:, fornece a base para todos os outros métodos de instância em sua interface. Uma subclasse de NSCharacterSet precisa apenas implementar este método, mais mutableCopyWithZone:, para um comportamento adequado. Para um desempenho ideal, uma subclasse também deve substituir bitmapRepresentation, que de outra forma funciona invocando characterIsMember: para cada valor Unicode possível. A classe NSCharacterSet declara uma interface de programação para um objeto que gerencia um conjunto de caracteres Unicode (consulte a especificação de cluster da classe NSString para obter informações sobre Unicode). O principal método primitivo do NSCharacterSet, characterIsMember: fornece a base para todos os métodos de instância em sua interface. Uma subclasse de NSCharacterSet só precisa implementar este método, mais o método mutableCopyWithZone:, para obter o comportamento correto. Para obter melhor desempenho, as subclasses também devem substituir a representação de bitmap; caso contrário, chame characterIsMember: para todos os valores Unicode possíveis.
NSCharacterSet é “ligado gratuitamente” com sua contraparte Core Foundation, CFCharacterSetRef. Consulte Ponte com ligação gratuita para obter mais informações sobre ponte com ligação gratuita. NSCharacterSet é “ligado gratuitamente” com sua contraparte de base central CFCharacterSetRef. Para obter mais informações sobre ponte gratuita, consulte ponte gratuita.
NSCharacterSet pode processar strings convenientemente
Por exemplo, determine se uma string começa com um número
NSString * string = "3dfdfsa";
unichar c = [string characterAtIndex:0];
if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:c]) {
return YES;
} else {
return NO;
}
}
Dois métodos em NSString relacionados ao NSCharacterSet: //Limpa os caracteres em ambas as extremidades da string de acordo com o conjunto de caracteres
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set; //Divide a string de acordo com o separador do conjunto de caracteres
- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separador;
NSString *string = @“123abc123”;
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
NSLog(@“%@”,string);//Saída abc
//字符集的二进制数据,用于传输、归档、保存成文件
@property (readonly, copy) NSData *bitmapRepresentation;
//一个除了数字字符之外的所有字符的字符集
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]
//判断aCharacter是否包含在字符集中
- (BOOL)characterIsMember:(unichar)aCharacter;
//功能貌似是一样的,入参是UTF-32的字符???不知道这两个方法的区别,知道的朋友不吝赐教
- (BOOL)longCharacterIsMember:(UTF32Char)theLongChar;
//判断theOtherSet是不是自身的子集
- (BOOL)isSupersetOfSet:(NSCharacterSet *)theOtherSet;
- (BOOL)hasMemberInPlane:(uint8_t)thePlane;
Codifique a string:
NSString * string = @"11 =Essential ,Coding Interview Questions + Coding Exercises!" ;
[string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
alphanumericCharacterSet Todos os números e letras (sem distinção entre maiúsculas e minúsculas)
O resultado após a codificação é:
11%20%3DEssential%20%2CCoding%20Interview%20Questions%20%2B%20Coding%20Exercises%21
Você pode ver que o resultado acima codifica todos os caracteres, exceto todos os números e letras.
Então observe a função de invertedSet
[string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet].invertedSet]
O resultado após adicionar invertedSet é o seguinte:
%31%31 =%45%73%73%65%6E%74%69%61%6C ,%43%6F%64%69%6E%67 %49%6E%74%65%72%76%69%65%77 %51%75%65%73%74%69%6F%6E%73 + %43%6F%64%69%6E%67 %45%78%65%72%63%69%73%65%73!
Você pode ver que apenas números e letras são codificados.
Em outras palavras, NSCharacterSet pode especificar facilmente quais caracteres codificar. Também é possível usar characterSetWithCharactersInString para caracteres codificados totalmente personalizados
NSCharacterSet *dd = [NSCharacterSet characterSetWithCharactersInString@"^~_>+=\"#%/<>?@\\^`{|}"];
```Blog relacionado: https://nshipster.cn/nscharacterset/
#### APIs comumente usadas
/** Coleção de métodos de atalho comumente usados (comumente usados, atendendo à maioria das necessidades) */
(NSCharacterSet *)controlCharacterSet; // Caracteres de controle, incluindo caracteres de nova linha (\n), caracteres de tabulação (\t), etc. Não está claro o que são.
(NSCharacterSet *)whitespaceCharacterSet; //espaço
(NSCharacterSet *)whitespaceAndNewlineCharacterSet;//Espaços e novas linhas
(NSCharacterSet *)decimalDigitCharacterSet; //Números de 0 a 9
(NSCharacterSet *) letraCharacterSet; //todas as letras
(NSCharacterSet *)minúsculaLetterCharacterSet; //letras minúsculas
(NSCharacterSet *)maiúsculasLetterCharacterSet; //letras maiúsculas
(NSCharacterSet *)nonBaseCharacterSet; //Não-base
(NSCharacterSet *)alfanumericCharacterSet; //Todos os números e letras (maiúsculas e minúsculas)
(NSCharacterSet *)decomposableCharacterSet; //Decomponível
(NSCharacterSet *)ilegalCharacterSet; //Ilegal
(NSCharacterSet *)pontuaçãoCharacterSet; //Os sinais de pontuação referem-se aos símbolos usados para separar o texto
(NSCharacterSet *)maiúsculoLetterCharacterSet; //Capitalizado
(NSCharacterSet *) símboloCharacterSet; // Caracteres de símbolo, exceto sinais de pontuação, como símbolos como ¥ e $
(NSCharacterSet *)newlineCharacterSet NS_AVAILABLE(10_5, 2_0);//Caractere de nova linha
/** Obtém um objeto NSCharacterSet baseado em uma determinada string */
+ (NSCharacterSet *)characterSetWithCharactersInString:(NSString *)aString;
/** Restrições de strings opostas [veja os exemplos a seguir para obter detalhes] */
@property (somente leitura, cópia) NSCharacterSet *invertedSet;
- personagemIsMember:
A função do NSCharacterSet é um pouco semelhante ao normal
:
https://nshipster.cn/nscharacterset/
NSString e Unicode:
https://objccn.io/issue-9-1/#peculiar-unicode-features
Blog em inglês do iOS: https://nshipster.com/
A versão chinesa correspondente acima: https://nshipster.cn/
Se você está confuso sobre o que é codificação de caracteres (mesmo que tenha um bom conhecimento profissional), então você deve aproveitar esta oportunidade para ler e reler este artigo clássico de Joel Spolsky: https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
## Compartilhar
1. Primeiro, compartilhe um site onde você possa verificar quais bibliotecas de terceiros são usadas por aplicativos com grandes downloads ou aplicativos populares na App Store: https://www.appsight.io
2. Deixe-me compartilhar mais alguns sites de algoritmos de aprendizagem, alguns são sites de vídeo e outros com animações:
* Vídeo de algoritmo de um indiano aprendendo algoritmo de inglês ao mesmo tempo: https://www.youtube.com/channel/UCx-kFfzekMbhODaBss-ZnsA
*Tutorial do algoritmo: https://notes.diguage.com/mysql/#_%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6
* Algoritmo gráfico: https://visualgo.net/zh
*
* Esta animação pode ajudá-lo a entender o algoritmo: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
* Explicação animada dos algoritmos comumente usados: https://www.toptal.com/developers/sorting-algorithms
*Essa animação também é boa, muito legal: http://sorting.at/
3. Recomende outro curso de banco de dados: https://15445.courses.cs.cmu.edu/fall2017/schedule.html
What to read next
Want more posts about ARTS?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home