WHAT IS THIS
This commit is contained in:
1 parent
5245f4ceae
commit
614bdc11a7
6 files changed
+522
No files matched your search
@@ -0,0 +1,63 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
nujmber. i will have to sort these.
|
||||||
|
|
||||||
|
a sensible implementation can be:
|
||||||
|
|
||||||
|
snprintf to convert this number to a list of chars.
|
||||||
|
|
||||||
|
sort these chars smallest to largest.
|
||||||
|
|
||||||
|
we will have three possibilities.
|
||||||
|
|
||||||
|
- if the number is 0, its free.
|
||||||
|
|
||||||
|
- if the number doesnt have a 0, its free. for these two cases we can atoi back to an int.
|
||||||
|
|
||||||
|
- if the number has a 0, since the number isnt 0, it has more than 1 digit. we can swap str[0] and str[1], and then its free.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define int_bits sizeof(int) * CHAR_BIT
|
||||||
|
|
||||||
|
int int_cmp(const void *a, const void *b);
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int to_process;
|
||||||
|
// scanf("%d", &to_process);
|
||||||
|
to_process = (1 << 29) + (1 << 18) + (1 << 9) + 399643581;
|
||||||
|
|
||||||
|
if (to_process < 0)
|
||||||
|
to_process = -to_process;
|
||||||
|
|
||||||
|
char numarray[int_bits + 1];
|
||||||
|
|
||||||
|
snprintf(numarray, int_bits, "%d", to_process);
|
||||||
|
printf("\n numer is %s\n", numarray);
|
||||||
|
int len = strlen(numarray);
|
||||||
|
qsort(numarray, len, sizeof(char), int_cmp);
|
||||||
|
printf("\n numer is %s\n", numarray);
|
||||||
|
for (int ind; ind < len; ++ind)
|
||||||
|
if (numarray[ind] != '0')
|
||||||
|
{
|
||||||
|
if (ind)
|
||||||
|
{
|
||||||
|
char temp = numarray[ind];
|
||||||
|
numarray[ind] = numarray[0];
|
||||||
|
numarray[0] = temp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
printf("\n numer is %s\n", numarray);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int int_cmp(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
return ((int)*(char *)a - (int)*(char *)b);
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
fuck ts is a leetcode medium or something how can i do two of them in 45 mins
|
||||||
|
|
||||||
|
12345 => 12354
|
||||||
|
123486 => 123468
|
||||||
|
751410 => 151470
|
||||||
|
|
||||||
|
12608 => 10628
|
||||||
|
125368764567523 => 1223...53
|
||||||
|
12301614 => 10321614
|
||||||
|
|
||||||
|
89764123 => 19764823
|
||||||
|
496774580 => 446779580
|
||||||
|
*/
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
void swapchar(char *a, char *b)
|
||||||
|
{
|
||||||
|
char tar = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = tar;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int powi(const int a, const int b) {
|
||||||
|
int r = 1, bb = b; while (bb-- > 0) r *= a;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int log10i(const int a) {
|
||||||
|
int c = 0, aa = a;
|
||||||
|
while (aa/=10) c++;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int leng = log10i(INT_MAX) + 1;
|
||||||
|
int to_process;
|
||||||
|
scanf("%d", &to_process);
|
||||||
|
if (to_process < 0)
|
||||||
|
to_process = -to_process;
|
||||||
|
char num_array[leng + 1];
|
||||||
|
int n = snprintf(num_array, leng, "%d", to_process);
|
||||||
|
printf("int but %d", leng);
|
||||||
|
int max_price = INT_MIN, p1max, p2max;
|
||||||
|
// price = how much it changes. 12345 => 6789 = 10000 - 0000 + 2000 - 6000 + ...;
|
||||||
|
// we calculate the lowest price.
|
||||||
|
for (int i = 0; i < n; ++i)
|
||||||
|
for (int j = i + 1; j < n; ++j)
|
||||||
|
{
|
||||||
|
int n1 = (num_array[i] - '0');
|
||||||
|
int n2 = (num_array[j] - '0');
|
||||||
|
if (!((n1 && n2) || (i && j)))
|
||||||
|
continue;
|
||||||
|
int p1 = powi(10, n - 1 - i);
|
||||||
|
int p2 = powi(10, n - 1 - j);
|
||||||
|
int price = n1 * p1 + n2 * p1 - n1 * p2 - n2 * p1;
|
||||||
|
if (price > max_price)
|
||||||
|
{
|
||||||
|
p1max = i;
|
||||||
|
p2max = j;
|
||||||
|
max_price = price;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (max_price != INT_MAX)
|
||||||
|
{
|
||||||
|
printf("\nprice = %d, p1 %d, p2 %d", max_price, p1max, p2max);
|
||||||
|
swapchar(num_array + p1max, num_array + p2max);
|
||||||
|
}
|
||||||
|
printf("\nnew numbe %s", num_array);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <limits.h>
|
||||||
|
int smallest_swap(const int n)
|
||||||
|
{
|
||||||
|
if (n < 10)
|
||||||
|
return n;
|
||||||
|
|
||||||
|
const int f = n % 10;
|
||||||
|
int mn = INT_MAX;
|
||||||
|
for (int m = n / 10, i = 10; m; i *= 10, m /= 10)
|
||||||
|
{
|
||||||
|
int d = m % 10;
|
||||||
|
int d1 = d, d2 = f, p1 = i, p2 = 1;
|
||||||
|
// you cant swap a 0 to the first digit
|
||||||
|
if (d2 == 0 && m < 10)
|
||||||
|
continue;
|
||||||
|
// n - og pair + swapped pair = new n
|
||||||
|
int nn = n - d1 * p1 - d2 * p2 + d1 * p2 + d2 * p1;
|
||||||
|
if (nn < mn)
|
||||||
|
mn = nn;
|
||||||
|
// else if (mn == n)
|
||||||
|
// continue;
|
||||||
|
}
|
||||||
|
return mn;
|
||||||
|
}
|
||||||
|
|
||||||
|
int orchestrator(const int n)
|
||||||
|
{
|
||||||
|
if (n < 10)
|
||||||
|
return n;
|
||||||
|
int l = smallest_swap(n);
|
||||||
|
// one digit
|
||||||
|
int r = orchestrator(n / 10) * 10 + n % 10;
|
||||||
|
return r < l ? r : l;
|
||||||
|
}
|
||||||
|
|
||||||
|
int uhh(const int n)
|
||||||
|
{
|
||||||
|
int n2 = orchestrator(n);
|
||||||
|
if (n == n2) // uhh
|
||||||
|
{
|
||||||
|
// which means no matter the swaps it will be bigger than (or equal to) the og.
|
||||||
|
int seenmask = 0;
|
||||||
|
for (int r = n; r; r /= 10)
|
||||||
|
{
|
||||||
|
int uhhhh = 1 << (r % 10);
|
||||||
|
if (seenmask & uhhhh)
|
||||||
|
{
|
||||||
|
printf("uh ");
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
seenmask |= uhhhh;
|
||||||
|
}
|
||||||
|
// which means no matter the swaps it will be bigger than the og. 123569 -> 123596
|
||||||
|
if (n < 100 && !(n % 10))
|
||||||
|
{
|
||||||
|
// not my fault teach
|
||||||
|
return INT_MAX;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (n / 100 * 100) + (n % 10 * 10) + (n % 100 / 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return n2;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
scanf("%d", &i);
|
||||||
|
printf("number in is %d, ", i);
|
||||||
|
printf("smallest is %d", uhh(i));
|
||||||
|
}
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
Problem: given a, b (same length), permute only a to minimize |perm(a) - b|.
|
||||||
|
|
||||||
|
Algo proposals
|
||||||
|
Iterative (main):
|
||||||
|
1) digits(a) -> sort ascending
|
||||||
|
2) iterate all unique perms via next_permutation
|
||||||
|
3) skip leading zero
|
||||||
|
4) build number, update best with |num - b|
|
||||||
|
Complexity: Time O(n!*n), Space O(1)
|
||||||
|
Correctness: enumerates each valid perm once; best tracked globally
|
||||||
|
|
||||||
|
Recursive (alt):
|
||||||
|
1) sort digits of a
|
||||||
|
2) backtrack positions with used[]; skip duplicates (i>0 && d[i]==d[i-1] && !used[i-1])
|
||||||
|
3) block leading zero at pos 0
|
||||||
|
4) on depth n, build number and update best
|
||||||
|
Complexity: Time O(n!*n), Space O(n)
|
||||||
|
Correctness: generates each unique valid perm exactly once
|
||||||
|
|
||||||
|
Edge cases: negatives or mismatched length -> -1; leading zeros disallowed
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
static int digits(int x)
|
||||||
|
{
|
||||||
|
if (x == 0)
|
||||||
|
return 1;
|
||||||
|
int c = 0;
|
||||||
|
while (x)
|
||||||
|
{
|
||||||
|
c++;
|
||||||
|
x /= 10;
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void to_digits(int x, int n, int *d)
|
||||||
|
{
|
||||||
|
for (int i = n - 1; i >= 0; --i)
|
||||||
|
{
|
||||||
|
d[i] = x % 10;
|
||||||
|
x /= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cmp_int(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
int x = *(const int *)a, y = *(const int *)b;
|
||||||
|
return (x > y) - (x < y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int next_perm(int *a, int n)
|
||||||
|
{ // O(n) per step
|
||||||
|
int i = n - 2;
|
||||||
|
while (i >= 0 && a[i] >= a[i + 1])
|
||||||
|
i--; // O(n)
|
||||||
|
if (i < 0)
|
||||||
|
return 0;
|
||||||
|
int j = n - 1;
|
||||||
|
while (a[j] <= a[i])
|
||||||
|
j--; // O(n)
|
||||||
|
int t = a[i];
|
||||||
|
a[i] = a[j];
|
||||||
|
a[j] = t;
|
||||||
|
for (int l = i + 1, r = n - 1; l < r; l++, r--)
|
||||||
|
{ // O(n)
|
||||||
|
int u = a[l];
|
||||||
|
a[l] = a[r];
|
||||||
|
a[r] = u;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int build_num(const int *a, int n)
|
||||||
|
{
|
||||||
|
int v = 0;
|
||||||
|
for (int i = 0; i < n; ++i)
|
||||||
|
v = v * 10 + a[i];
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iteration: enumerate perms of a, track min |perm(a)-b| (Time: O(n!*n))
|
||||||
|
int minAbsDiffIter(int a, int b)
|
||||||
|
{
|
||||||
|
if (a < 0 || b < 0) return -1;
|
||||||
|
if (digits(a) != digits(b)) return -1;
|
||||||
|
int n = digits(a);
|
||||||
|
int *d = (int *)malloc(sizeof(int) * n);
|
||||||
|
to_digits(a, n, d);
|
||||||
|
qsort(d, n, sizeof(int), cmp_int);
|
||||||
|
int best = INT_MAX;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (d[0] == 0) continue; // no leading zero
|
||||||
|
int v = build_num(d, n);
|
||||||
|
int diff = v - b; if (diff < 0) diff = -diff;
|
||||||
|
if (diff < best) best = diff;
|
||||||
|
} while (next_perm(d, n));
|
||||||
|
free(d);
|
||||||
|
return best;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recursion: backtrack digits of a, update best on full build (Time: O(n!*n))
|
||||||
|
static void dfs_rec(int pos, int n, const int *d, int *used, int *cur, int b, int *best)
|
||||||
|
{
|
||||||
|
if (pos == n)
|
||||||
|
{
|
||||||
|
int v = build_num(cur, n);
|
||||||
|
int diff = v - b; if (diff < 0) diff = -diff;
|
||||||
|
if (diff < *best) *best = diff;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
if (used[i]) continue;
|
||||||
|
if (i && d[i] == d[i - 1] && !used[i - 1]) continue; // skip dups
|
||||||
|
if (pos == 0 && d[i] == 0) continue; // no leading zero
|
||||||
|
used[i] = 1; cur[pos] = d[i];
|
||||||
|
dfs_rec(pos + 1, n, d, used, cur, b, best);
|
||||||
|
used[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int minAbsDiffRec(int a, int b)
|
||||||
|
{
|
||||||
|
if (a < 0 || b < 0) return -1;
|
||||||
|
if (digits(a) != digits(b)) return -1;
|
||||||
|
int n = digits(a);
|
||||||
|
int *d = (int *)malloc(sizeof(int) * n);
|
||||||
|
to_digits(a, n, d);
|
||||||
|
qsort(d, n, sizeof(int), cmp_int);
|
||||||
|
int *used = (int *)calloc(n, sizeof(int));
|
||||||
|
int *cur = (int *)malloc(sizeof(int) * n);
|
||||||
|
int best = INT_MAX;
|
||||||
|
dfs_rec(0, n, d, used, cur, b, &best);
|
||||||
|
free(d); free(used); free(cur);
|
||||||
|
return best;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int a = 2376, b = 1378; // expect 989 = |2367 - 1378|
|
||||||
|
printf("iter: %d\n", minAbsDiffIter(a, b));
|
||||||
|
printf("recu: %d\n", minAbsDiffRec(a, b));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
f(x) = 3x + 1
|
||||||
|
|
||||||
|
THE LIST will have two lists.
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef struct IntIntMap
|
||||||
|
{
|
||||||
|
int *x;
|
||||||
|
int *fx;
|
||||||
|
int size;
|
||||||
|
int cap;
|
||||||
|
int (*apply)(int); // f(x)
|
||||||
|
} Map;
|
||||||
|
|
||||||
|
int f(int x)
|
||||||
|
{
|
||||||
|
return 3 * x + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map init(int cap, int (*fn)(int))
|
||||||
|
{
|
||||||
|
int *x = (int *)malloc(sizeof(int) * cap);
|
||||||
|
if (!x)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
int *fx = (int *)malloc(sizeof(int) * cap);
|
||||||
|
if (!fx)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
return (Map){
|
||||||
|
x,
|
||||||
|
fx,
|
||||||
|
0,
|
||||||
|
cap,
|
||||||
|
fn ? fn : f,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_fx(Map *map, int (*fn)(int)) { map->apply = fn ? fn : f; }
|
||||||
|
|
||||||
|
void resize_m(Map *map)
|
||||||
|
{
|
||||||
|
int newcap = map->cap * 2;
|
||||||
|
int *nx = (int *)malloc(sizeof(int) * newcap);
|
||||||
|
if (!nx)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
int *nfx = (int *)malloc(sizeof(int) * newcap);
|
||||||
|
if (!nfx)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
|
for (int i = 0; i < map->size; ++i)
|
||||||
|
{
|
||||||
|
nx[i] = map->x[i];
|
||||||
|
nfx[i] = map->fx[i];
|
||||||
|
}
|
||||||
|
free(map->x);
|
||||||
|
free(map->fx);
|
||||||
|
map->x = nx;
|
||||||
|
map->fx = nfx;
|
||||||
|
map->cap = newcap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_m(Map *map, int x)
|
||||||
|
{
|
||||||
|
if (map->size == map->cap)
|
||||||
|
resize_m(map);
|
||||||
|
int fx = map->apply ? map->apply(x) : f(x);
|
||||||
|
int sz = map->size++;
|
||||||
|
map->x[sz] = x;
|
||||||
|
map->fx[sz] = fx;
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_m(Map *map, int x)
|
||||||
|
{
|
||||||
|
// shift elements to the left
|
||||||
|
for (int i = 0; i < map->size; i++)
|
||||||
|
{
|
||||||
|
if (map->x[i] == x)
|
||||||
|
{
|
||||||
|
for (int j = i; j < map->size - 1; j++)
|
||||||
|
{
|
||||||
|
map->x[j] = map->x[j + 1];
|
||||||
|
map->fx[j] = map->fx[j + 1];
|
||||||
|
}
|
||||||
|
map->size--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void print(Map *map)
|
||||||
|
{
|
||||||
|
printf("Map:\n");
|
||||||
|
for (int i = 0; i < map->size; i++)
|
||||||
|
{
|
||||||
|
printf("%d -> %d\n", map->x[i], map->fx[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_m(Map *map)
|
||||||
|
{
|
||||||
|
free(map->x);
|
||||||
|
free(map->fx);
|
||||||
|
map->x = map->fx = NULL;
|
||||||
|
map->size = map->cap = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
Map map = init(6, f);
|
||||||
|
add_m(&map, 1);
|
||||||
|
add_m(&map, 4);
|
||||||
|
add_m(&map, 7);
|
||||||
|
add_m(&map, 10);
|
||||||
|
print(&map);
|
||||||
|
remove_m(&map, 10);
|
||||||
|
print(&map);
|
||||||
|
free_m(&map);
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# Binary search tree
|
||||||
|
|
||||||
|
sample array:
|
||||||
|
|
||||||
|
X = [17, 3, 46, 70, 15, 13, 28, 7, 90]
|
||||||
|
|
||||||
|
## tree structure
|
||||||
|
|
||||||
|
BST built by inserting X in order:
|
||||||
|
|
||||||
|
```text
|
||||||
|
17
|
||||||
|
/ \
|
||||||
|
3 46
|
||||||
|
\ / \
|
||||||
|
15 28 70
|
||||||
|
/ \
|
||||||
|
13 90
|
||||||
|
/
|
||||||
|
7
|
||||||
|
```
|
||||||
|
|
||||||
|
## visit algorithm
|
||||||
|
|
||||||
|
### the algo
|
||||||
|
|
||||||
|
- recursively visit right child
|
||||||
|
- recursively visit left child
|
||||||
|
- visit the node, display its value
|
||||||
|
|
||||||
|
### the result
|
||||||
|
|
||||||
|
running this algorithm on the BST above yields:
|
||||||
|
|
||||||
|
```text
|
||||||
|
90 70 28 46 7 13 15 3 17
|
||||||
|
```
|
||||||
Reference in new issue
Block a user