Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Eliminarea primului element dintr-un sir.
Last Updated: May 28 2022 06:15, Started by
Irbaa
, May 19 2022 14:08
·
0
#1
Posted 19 May 2022 - 14:08
Este posibil sa eliminam primul element dintr-un sir fara sa mutam toate elementele sirului cu o pozitie spre dreapta?
Trebuie sa existe o solutie mai simpla decat asta : #include <iostream> using namespace std; int main() { int n , v[100]; cin >> n; for(int i = 1; i <= n; ++i){ cin >> v[i]; } for (int i = 1; i <= n; ++i){ v[i] = v[i + 1]; } --n; for (int i = 1; i <= n; ++i){ cout << v[i] << " "; } return 0; } Edited by Irbaa, 19 May 2022 - 14:09. |
#2
Posted 19 May 2022 - 14:17
Pointeri. Da-i ca adresa elementul doi si asa ai un vector fara primul element. Si ai grija la parcurgere ca e mai scurt, altfel umbli creanga prin memorie.
Edited by neagu_laurentiu, 19 May 2022 - 14:19. |
#3
Posted 19 May 2022 - 14:46
Oare se poate realiza aceasta operatie decat cu "for" si/sau "while" ? Eu m-am gandit initial sa inversez valoarea primei pozitii cu valoarea celei de a doua si sa elimin ultima pozitie , dar pe urma imi dau peste cap ordinea sirului.
Sau sa inversez toate valorile si sa elimin ultima pozitie dar asta presupune mai multe operatii decat metoda initiala. |
#4
Posted 19 May 2022 - 14:52
In ce clasa esti de n-ai inteles ce am zis mai sus? Echivalent cu a folosi i ca fiind i+1. Sau o functie care returneaza indexul modificat,.
Vezi ca in C indexul pleaca de la 0 si nu 1, asa ca ai grija la final. Edited by neagu_laurentiu, 19 May 2022 - 14:53. |
#5
Posted 19 May 2022 - 15:07
Bun, te- am inteles. Dar daca trebuie sa fac asta in mod repetat, cum fac? Adica sa presupunem ca avem un sir , iar asupra acelui sir vreau sa efectuez urmatoarele operatii: Vreau sa elimin prima pozitie din sir cand voi introduce tasta 1 sau sa adaug un nou numar la final cand voi introduce tasta 2. Din cate am inteles , ce imi zici tu este sa ignor pur si simplu prima pozitie a sirului si sa afisez sirul fara ea. Corect?
Edited by Irbaa, 19 May 2022 - 15:08. |
#7
Posted 19 May 2022 - 15:30
Probabil nu m-am exrpimat suficient de bine , dar eu vreau sa elimin primul element al sirului cu tot cu pozitie.
|
#8
Posted 19 May 2022 - 15:32
Pe o alocare statica (int v[100]; ) nu poti. E batut in cuie spatiul asta. Poti doar sa te joci cu elementele index in asa fel sa para ca stergi/adaugi. Altfel trebuie alocare dinamica, pointeri, liste etc.
Edited by neagu_laurentiu, 19 May 2022 - 15:34. |
#9
Posted 19 May 2022 - 16:08
Ai informatia in memorie, dar ce vrei sa faci cu ea? Tii neaparat sa modifici ordinea/pozitia elementelor in memorie? Vei fi obligat s-o faci... Vrei insa doar sa afisezi/faci aproape orice cu toate elementele mai putin primul? Ignori primul element.
|
#10
Posted 19 May 2022 - 17:11
Irbaa, on 19 mai 2022 - 15:30, said:
Probabil nu m-am exrpimat suficient de bine , dar eu vreau sa elimin primul element al sirului cu tot cu pozitie. daca elimini primul centimetru, gradat intre 0 si 1, ramaii cu 99 de centimenetri, de la 1 pana la 100. doar ca acum primul centimetru o sa fie gradat intre 1 si 2 pozitia este relativa fata de inceputului sirului, pozitia 0 inseamna ca ne-am indepartat 0 unitati (intregi) fata de pozitia de start partea cu adaugatul unui numar nou la final este mai complcata, pentru ca nu ai drept de lucru asupra acelei memorii poti sa rescrii pozitiile pe care le-ai ignorat si sa le afisezi la final for ( pozitie = 5; pozitie < 105; pozitie++ ) afiseaza sir [ pozitie % 100 ] ; for(int i = 1; i <= n; ++i){ cin >> v[i]; } for (int i = 1; i <= n; ++i){ v[i] = v[i + 1]; }repetam, special pentru tine indexarea porneste de la 0; bucla for trebuie sa opreasca cand indexul este cu numarul de elemente, astfel sa nu accesam pozitia urmatoare "ultimei pozitii", tu nu doar ca faci asta, dar mergi inca un pas pentru n = 100; i = i+1 rezuulta i=101; v[99] | v[100] | v[101] Edited by MarianG, 19 May 2022 - 17:02. |
|
#11
Posted 19 May 2022 - 17:41
Irbaa, on 19 mai 2022 - 14:08, said:
Este posibil sa eliminam primul element dintr-un sir fara sa mutam toate elementele sirului cu o pozitie spre dreapta? solutia asta nu functioneaza, evident, daca iti doresti (din diverse motive) sa pastrezi ordinea elementelor din lista, dar n-ai mentionat nimic de genul asta. |
#12
Posted 19 May 2022 - 18:27
Da Smiley, m-am gandit si eu la asta , dar din pacate e nevoie ca ordinea elementelor din sir sa ramana intacta.
Bun, am sa va arat exact la ce imi trebuie. Date de intrare Pe prima linie se află două numere, n și m. Pe următoarele linii se află n numere naturale. Pe următoarele m linii se află operațiile ce trebuie făcute: 1 dacă trebuie extrasă prima foaie 2 urmat de o valoare x, dacă trebuie introdusă o nouă foaie la sfârșit. Date de ieșire Pe prima linie se va afișa numărul de foi rămase pe biroul lui Andrei în urma executării celor m operații, iar pe a doua linie, numerele de identificare ale acestora. Restricții 1 ≤ n ≤ 900 000 1 ≤ m ≤ 400 000 Numerele sunt cuprinse intre 0 și 10 000, inclusiv Dacă șirul nu mai conține niciun element și trebuie efectuată o operație de tip 1, operația nu va fi efectuată. iar codul meu arata cam asa #include <iostream> using namespace std; int main() { int n , m , v[900001] , w [400001] , x; cin >> n >> m; for (int i = 1; i <= n; ++i){ cin >> v[i]; } for (int i = 1; i <= m ; ++i){ cin >> w[i]; if (w[i] == 2){ cin >> x; ++n; v[n] = x; }else if (w[i] == 1 && n > 0){ for (int i = 1 ; i < n; ++i){ v[i] = v[i + 1]; } --n; } } cout << n << "\n"; for(int i = 1; i <= n; ++i){ cout << v[i] << " " ; } return 0; }Codul e bun,zic eu dar e prea lent. Depasesc limita de timp la doua teste, nu iau punctaj maxim si ma gandesc ca o fii din cauza modului in care elimin primul element din sir, procesul e prea lent. Iau decat 80 de pcte la problema aceasta. |
#13
Posted 19 May 2022 - 20:23
Evident ca e prea lent. Daca ti se cere de 400.000 de ori sa scoti cate un element din cele 900.000 initiale, ajungi sa faci sute de miliarde de mutari de elemente.
Extrasa prima foaie => incrementezi un contor/pointer si atat (cu verificare daca mai ai elemente inainte sa incrementezi). |
#14
Posted 19 May 2022 - 23:03
O intrebare proasta, ce faci cand ai doar operatii "2"?
Ce rol are sirul "w"? Edited by MarianG, 19 May 2022 - 22:56. |
#15
Posted 20 May 2022 - 05:13
Irbaa, on 19 mai 2022 - 18:27, said:
....Bun, am sa va arat exact la ce imi trebuie.... ......Codul e bun,zic eu dar e prea lent... varianta cea mai rapida este sa aloci de la inceput memorie pentru n+m elemente si sa pastrezi in 2 variabile pozitia primului si ultimului element din sir - operatia 1 => doar incrementezi pozitia primului element (initial va fi zero), cu conditia sa ai elemente in sir (compari cele 2 pozitii) - operatia 2 => adaugi valoarea la sfarsitul sirului (folosind pozitia ultimului element) si incrementezi pozitia ultimului element la sfarsit calculezi numarul de elemente (diferenta dintre cele 2 pozitii + 1) si afisezi elementele singura problema ar fi memorie: intotdeauna o sa aloci memorie ca si cum ai fi in situatia cea mai nefavorabila (doar operatii 2) |
|
#16
Posted 20 May 2022 - 12:27
de fapt, de ce nu C++ ?
vector.erase(vector.begin()) respectiv vector.push_back() ? C++ fara dedesupturile cu alocari, dealocari, mutari, pointeri, indecsi |
#17
Posted 20 May 2022 - 12:35
vector.erase(vector.begin()) e la fel de lent ca solutia existenta.
|
#18
Posted 20 May 2022 - 12:39
evident ca este,
acum ramane in sarcina lui sa adapteze indiciile ce i-au fost oferite si sa prezinte solutia finala |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users