2015-05-13 15 views
6

Đây là câu hỏi đưa ra: Cho một số không âm thể hiện dưới dạng một loạt các chữ số,ArrayList Loại bỏ phần tử đầu tiên

thêm từ 1 tới số (tăng số đại diện bởi các chữ số).

Các chữ số được lưu trữ sao cho chữ số quan trọng nhất nằm ở đầu danh sách.

Ví dụ:

Nếu vector có [1, 2, 3]

vector trở nên [1, 2, 4]

như 123 + 1 = 124.

Đây là mã của tôi:

public class Solution { 
    public ArrayList<Integer> plusOne(ArrayList<Integer> A) {  
     int carry = 1; 
     int length = A.size(); 
     ArrayList result = new ArrayList(); 

     for(int i = length - 1; i >=0; i--){ 
      int val = A.get(i) + carry; 
      result.add(0,val % 10); 
      carry = val/10; 
     } 

     if (carry == 1){ 
      result.add(0,1); 
     } 

     for (int j = 0; j < result.size(); j++){ 
      if(result.get(j).equals(0)) 
       result.remove(j); 
      else 
       break; 
     } 

     return result; 

    } 
    } 

Tuy nhiên, trong trường hợp thử nghiệm: Một : [0, 6, 0, 6, 4, 8, 8, 1]

nó nói chức năng của tôi trả

trong khi câu trả lời đúng là

Tôi không biết có gì sai với mã của mình.

Cảm ơn!

Trả lời

7
if(result.get(j).equals(0)) 
    result.remove(j); 
else 
    break; 

này sẽ thất bại nếu mỗi chỉ số khác chứa 0. Đây là những gì sẽ xảy ra:

0 6 0 6 4 8 8 2 
^ (j = 0) 

Các 0 sẽ được gỡ bỏ, và j được tăng lên một.

6 0 6 4 8 8 2 
^(j = 1) 

Sau đó, 0 cũng bị xóa, bỏ qua 6 đầu tiên trong mảng của bạn. Để sửa lỗi này, thay đổi đoạn tới:

if(result.get(j).equals(0)) 
    result.remove(j--); 
else 
    break; 

này đền bù cho khi một chỉ số được lấy ra để j sẽ không bỏ qua số ngay sau khi bất kỳ 0s gỡ bỏ.

+0

Điều gì sẽ xảy ra khi k = 0 có giá trị từ 0, không có phần tử trong j-- – Sanshayan

+0

@ Sanshai28 'cái' for (int j = 0; j

+0

@PatrickRoberts Cảm ơn tôi đã hiểu – Sanshayan

0

Kiểm tra ra một câu hỏi tương tự tại Looping through and arraylist and removing elements at specified index

đơn giản để làm

while (!result.isEmpty() && result.get(0).equals(0)) { 
    result.remove(0); 
} 

này sẽ tiếp tục xóa trái nhất 0 cho đến khi có được không trái nhiều nhất không để bị xóa.

+0

Cảm ơn bạn đã lưu ý! Tôi nghĩ rằng đây là một cách thanh lịch hơn để loại bỏ các bản sao trước một danh sách mảng. –

+0

Để được pedantic, giả sử rằng các chức năng luôn luôn nhận được mảng với số nguyên không âm, sau khi thêm 1, bạn sẽ không bao giờ có một mảng đó là sản phẩm nào hoặc sẽ trở thành sản phẩm nào khi nó đạt đến vòng lặp này. –

+0

Vâng, mảng đầu vào có thể không có 0 số ở phía trước ở vị trí đầu tiên và phải chứa số không âm. Nếu bạn thêm nó vào 1, sẽ không có cơ hội nào có 0 số trước kết quả. – Nat

0

Vòng lặp for cuối cùng của bạn đang xóa 0 khỏi kết quả của bạn ArrayList<Integer>.Sau khi loại bỏ vòng lặp đó, bạn sẽ nhận được kết quả hoàn hảo

public static ArrayList<Integer> plusOne(ArrayList<Integer> A) {  
    int carry = 1; 
    int length = A.size(); 
    ArrayList result = new ArrayList(); 

    for (int i = length - 1; i >= 0; i--) { 
     int val = A.get(i) + carry; //2 8 
     result.add(0, val % 10); // 2 8 
     carry = val/10; 
    } 

    if (carry == 1) { 
     result.add(0, 1); 
    } 

// for (int j = 0; j < result.size(); j++) { 
//  if (result.get(j).equals(0)) 
//   result.remove(j); 
//  else 
//   break; 
// } 

    for (boolean isZero = true; isZero;) { 
     isZero = result.get(0).equals(0); 

     if(isZero) 
      result.remove(0); 
    } 

    return result; 
} 
+0

Ok tôi sẽ sửa nó .. cảm ơn – Kushal

+0

@PatrickRoberts Tôi đã chỉnh sửa câu trả lời của tôi .. điều này là theo của bạn requrement .. đầu ra là: ** [6, 0, 6, 4, 8, 8, 2] ** – Kushal

Các vấn đề liên quan