ờ nhỉ, chỉ cần thế này thôi, đâu cần thiết phải
ahihi
ờ nhỉ, chỉ cần thế này thôi, đâu cần thiết phải
ahihi
hồi trước giải bài này mình cũng suy nghĩ như vậy, cần làm cho 2 chuỗi dài bằng nhau code còn kinh dị mỹ hơn nữa
không dùng đến hàm sort cơ anh, e làm cách tương tự thế rồi
bạn hãy viết chương trình sắp xếp dãy số
là sao đây :V
chắc ý bạn ấy là không dùng hàm sort với custom compare, mà tự viết theo thuật toán sắp xếp gì đó như chèn, nổi bọt…
vậy cũng khác gì dùng hàm sort đâu ?.?
hỏi nấu cơm ko cho xài nồi cơm điện thì bó tay mình có biết đốn củi đâu
ý e là không dùng sort luôn kiểu sort (arr.begin(), arr.end(), comp). E không nhìn ra cách nó hoạt động, e muốn code lại cái hàm đấy.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool Whichputfirst(string a, string b)
{
string ab=a.append(b);
string ba=b.append(a);
if(ab.compare(ba)>0) return true;
return false;
}
main()
{
int n; cin >> n; string a[n];
for(int i=0; i<n; i++) cin >> a[i];
sort(a, a+n, Whichputfirst);
for(int i=0; i<n; i++) cout << a[i];
return 0;
}
// đây là code e đã viết
vậy em viết code sắp xếp chuỗi theo alphabet đi :V
chỗ nào có so sánh a[i] < a[j]
thì sửa lại thành Whichputfirst(a[i], a[j])
là xong…
ví dụ với 3 số 85 997 88 thì nó xét như nào a.
em cứ thấy nếu nó ghép 997 với 85 trước thì lại không đúng
Toạch a = “42”, b = “42424”
b + a = “4242442”
a + b = “4242424”
mất cả buổi sáng.
trong cái comparator a + b > b + a mới đúng :V mới sửa :V sắp xếp ngược mới đẩy số lớn hơn lên trước.
à cái vụ căng độ dài a = độ dài b này lỗi tùm lum, code kinh dị luôn mà =]
đầu tiên nó so sánh 85 với 997, “85997” > “99785” sai, nên nó đổi vị trí 2 số này để cho 997 đứng trước: 997 85 88
sau đó nó so sánh 997 với 88: “99788” > “88997” đúng nên nó giữ nguyên vị trí 2 số: 997 85 88
997 là lớn nhất, so sánh tiếp 2 số còn lại là 85 và 88. “8588” > “8885” sai nên nó đổi vị trí 2 số này: 997 88 85
hết cái để so sánh :V
a + b > b + a này nó có tính bắc cầu thật suy ra được a + a ~ b + b là xong.
package javaapplication2;
import java.util.Scanner;
public class JavaApplication2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n;
System.out.print("moi nhap n: ");
n=sc.nextInt();
int[] ar=new int[n];
for(int i=0;i<n;i++){
System.out.print("moi nhap ar["+i+"]: ");
ar[i]=sc.nextInt();
}
for(int i=0;i<n;i++){
for(int j=0;j<n-1;j++){
int Fdigit1=GetFirstDigit(ar[j]);
int Fdigit2=GetFirstDigit(ar[j+1]);
if(Fdigit1<Fdigit2){
int x=ar[j];
ar[j]=ar[j+1];
ar[j+1]=x;
}
}
}
for(int u=1;u<10;u++){
for(int i=0;i<n;i++){
for(int j=0;j<n-1;j++){
int Fdigit1=GetFirstDigit(ar[j]);
int Fdigit2=GetFirstDigit(ar[j+1]);
if(u==Fdigit1 && u==Fdigit2){
String s1=ar[j]+"";
String s2=ar[j+1]+"";
if(Integer.parseInt(s1+s2)<Integer.parseInt(s2+s1)){
int x=ar[j];
ar[j]=ar[j+1];
ar[j+1]=x;
}
}
}
}
}
System.out.println("cac so sap xep thanh so nguyen lon nhat la: ");
for(int i=0;i<n;i++){
System.out.print(ar[i]+" ");
}
//2, 6, 12, 32, 26, 25, 254, 555, 257, 251
}
static int GetFirstDigit(int number){
String numberString = "" + number;
char firstLetterchar = numberString.charAt(0);
int firstDigit = Integer.parseInt("" + firstLetterchar);
return firstDigit;
}
}
Output:
moi nhap n: 10
moi nhap ar[0]: 2
moi nhap ar[1]: 6
moi nhap ar[2]: 12
moi nhap ar[3]: 32
moi nhap ar[4]: 26
moi nhap ar[5]: 25
moi nhap ar[6]: 254
moi nhap ar[7]: 555
moi nhap ar[8]: 257
moi nhap ar[9]: 251
cac so sap xep thanh so nguyen lon nhat la:
6 555 32 26 257 254 25 251 2 12 BUILD SUCCESSFUL (total time: 25 seconds)
Kết quả cùa bạn sẽ sai nếu mảng có các số: 2, 6, 12, 32, 26, 25, 254, 555, 257, 251
ò, vậy chắc phải + full chứ không phải độ dài bằng nhau
Ban đầu mình nghĩ bạn đúng, nhưng thử làm một trường hợp đơn giản thì thấy nó tréo ngoe => phản thí dụ
Tức là ntn, giả sử |b| > |a|, ta setup sao cho |b| kí tự đầu của a+b và b+a bằng nhau và giải hệ.
chài ai, nghe giống Toán quá vại, mình dốt Toán TT_TT
Nếu chỉ để soi từng cặp kí tự thì không cần tính a+b hay b+a max speed.
chẳng qua là chưa có cách học